[
  {
    "path": ".gitignore",
    "content": ".gradle\n/build/\n!gradle/wrapper/gradle-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springBeans\n\n### IntelliJ IDEA ###\n.idea\n*.iws\n*.iml\n*.ipr\n\n### NetBeans ###\nnbproject/private/\nbuild/\nnbbuild/\ndist/\nnbdist/\n.nb-gradle/"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "---\n## 特别鸣谢\n\n本项目 CDN 加速及安全防护由 Tencent EdgeOne 赞助\n\n[![Tencent EdgeOne](https://edgeone.ai/media/34fe3a45-492d-4ea4-ae5d-ea1087ca7b4b.png)](https://edgeone.ai/zh?from=github)\n\n---\n\n\n# 个人主页\n\n[https://zzzmh.cn/](https://zzzmh.cn/)\n\n---\n\n# 友情链接\n\n[https://yunduo250.com/](https://yunduo250.com/)\n\n---\n\n# 关于本项目简介\n\n[https://zzzmh.cn/single.jsp?id=2](https://zzzmh.cn/single.jsp?id=2)\n\n---\n\n# 线上预览地址\n\n[https://zzzmh.cn/projectoa/index](https://zzzmh.cn/projectoa/index)\n测试账号: `admin`\n测试密码: `123456`\n\n---\n\n# 笔记\n\n* **DB具体设计笔记地址**: [http://leanote.com/blog/post/5a82b593ab644140d2000fdf](http://leanote.com/blog/post/5a82b593ab644140d2000fdf)\n* **开发日志地址**: [http://leanote.com/blog/post/5a7bb4d5ab6441766a0008f1](http://leanote.com/blog/post/5a7bb4d5ab6441766a0008f1)\n* **Redis相关设计和实现方法**: [http://leanote.com/blog/post/5a8e1f37ab64410bff0002ee](http://leanote.com/blog/post/5a8e1f37ab64410bff0002ee)\n* **Shiro相关**: [http://leanote.com/blog/post/5a8e6b48ab64410bff000863](http://leanote.com/blog/post/5a8e6b48ab64410bff000863)\n\n---\n\n# 参考\n\n* **ityouknow的springboot系列**: 参考了他的第三、四、十四、二十章节，他官网里有他的源码GITHUB：[http://www.ityouknow.com/spring-boot.html](http://www.ityouknow.com/spring-boot.html)\n* **使用spring-boot-admin对spring-boot服务进行监控**: [http://blog.csdn.net/clementad/article/details/70613209](http://blog.csdn.net/clementad/article/details/70613209)\n* **详解html和thymeleaf中的相对路径，解决springboot前台页面的相对路径问题**: [http://blog.csdn.net/qq_35603331/article/details/76255125](http://blog.csdn.net/qq_35603331/article/details/76255125)\n* **彩虹猫启动画面**: [https://raw.githubusercontent.com/snicoll-demos/spring-boot-4tw-uni/master/spring-boot-4tw-web/src/main/resources/banner.txt](https://raw.githubusercontent.com/snicoll-demos/spring-boot-4tw-uni/master/spring-boot-4tw-web/src/main/resources/banner.txt)\n* **SpringBoot项目中使用redis缓存的方法步骤**: [http://www.jb51.net/article/129775.htm](http://www.jb51.net/article/129775.htm)\n* **开涛大神的《跟我学Shiro》系列**: [http://jinnianshilongnian.iteye.com/blog/2018398](http://jinnianshilongnian.iteye.com/blog/2018398)\n\n---\n\n# 感谢\n\n该项目是由 **程衫耘朵** 和 **张明辉** 共同完成！\n\n特别要感谢**云朵**同学的鼎力相助！！！\n\n* [https://github.com/chsyd1028](https://github.com/chsyd1028)\n* [https://github.com/zzzmhcn](https://github.com/zzzmhcn)\n\n---\n\n# 改善空间\n\n1.  `calculator.js` 中存在监控键盘事件方法，会影响文字输入时，按退格无效的情况。目前只在首页引入 `calculator.js`，但还是影响了 `todoList` 备忘录的输入删除。\n2.  `Shiro` 和 `springbootadmin` 冲突问题，目前只通过反过来配置 `Shiro` 解决，使用起来差别不大，但不完美。\n3.  手机端部分组件兼容性不强，例如表格在手机显示不理想。\n4.  `Shiro` 未使用盐值加密。\n5.  `Redis` 命名方式和存读方式还有优化空间。\n\n---\n\n# 注意\n\n* 初次使用请修改配置文件 `projectoa\\src\\main\\resources\\application.properties`:\n    * `spring.datasource.***`: 配置MySQL\n    * `spring.redis.***`: 配置Redis (如果是本机就不用配)\n    * `logback.filepath`: 配置输出日志路径\n* 首次使用需要向数据库导入 `projectoa\\database\\dboa.sql` 文件。\n* 请使用 **IDEA 2017.03 或以上版本** 导入本项目，并且建议使用本地独立版本的 **Gradle (4.4以上)**。\n"
  },
  {
    "path": "build.gradle",
    "content": "buildscript {\n\text {\n\t\tspringBootVersion = '1.5.10.RELEASE'\n\t}\n\trepositories {\n\t\tmaven {url 'http://maven.aliyun.com/nexus/content/groups/public/'}\n\t}\n\tdependencies {\n\t\tclasspath(\"org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}\")\n\t}\n}\n\napply plugin: 'java'\napply plugin: 'eclipse-wtp'\napply plugin: 'org.springframework.boot'\napply plugin: 'war'\n\ngroup = 'com.zmh'\nversion = '0.0.1'\nsourceCompatibility = 1.8\n\nrepositories {\n\tmaven {url 'http://maven.aliyun.com/nexus/content/groups/public/'}\n}\n\nconfigurations {\n\tprovidedRuntime\n}\n\ndependencies {\n    compile('org.springframework.boot:spring-boot-starter-web')\n\t//数据库相关\n    compile('mysql:mysql-connector-java')\n\tcompile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1')\n    //友好的HTML规范 搭配spring.thymeleaf.mode=LEGACYHTML5\n\tcompile('org.springframework.boot:spring-boot-starter-thymeleaf')\n    compile('net.sourceforge.nekohtml:nekohtml:1.9.22')\n    //热部署 搭配spring.thymeleaf.cache=false\n    compile('org.springframework.boot:spring-boot-devtools')\n    //SpringBoot内置的Redis\n    compile('org.springframework.boot:spring-boot-starter-data-redis')\n    //内置tomcat 仅开发测试用\n\t//runtime('org.springframework.boot:spring-boot-starter-tomcat')\n    //spring-boot-admin 图形化管理页面\n    compile('de.codecentric:spring-boot-admin-server:1.5.7')\n    compile('de.codecentric:spring-boot-admin-server-ui:1.5.7')\n    compile('de.codecentric:spring-boot-admin-starter-client:1.5.7')\n\t//pagehelper\n\tcompile group: 'com.github.pagehelper', name: 'pagehelper-spring-boot-starter', version: '1.2.3'\n    //使用的是shiro-spring 而非shiro\n    compile('org.apache.shiro:shiro-spring:1.4.0')\n\tcompile('com.github.theborakompanioni:thymeleaf-extras-shiro:1.2.1')\n\t//测试\n    testCompile('org.springframework.boot:spring-boot-starter-test')\n}\n"
  },
  {
    "path": "database/dboa.sql",
    "content": "/*\nNavicat MySQL Data Transfer\n\nSource Server         : 139.196.72.225\nSource Server Version : 50721\nSource Host           : localhost:3306\nSource Database       : dboa\n\nTarget Server Type    : MYSQL\nTarget Server Version : 50721\nFile Encoding         : 65001\n\nDate: 2018-03-19 09:46:02\n*/\n\nSET FOREIGN_KEY_CHECKS=0;\n\n-- ----------------------------\n-- Table structure for calendar\n-- ----------------------------\nDROP TABLE IF EXISTS `calendar`;\nCREATE TABLE `calendar` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `user_id` int(11) NOT NULL,\n  `title` varchar(255) DEFAULT NULL,\n  `start_time` datetime NOT NULL,\n  `end_time` datetime NOT NULL,\n  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of calendar\n-- ----------------------------\n\n-- ----------------------------\n-- Table structure for departments\n-- ----------------------------\nDROP TABLE IF EXISTS `departments`;\nCREATE TABLE `departments` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `department` varchar(255) DEFAULT NULL,\n  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of departments\n-- ----------------------------\nINSERT INTO `departments` VALUES ('1', '管理员', '2018-02-13 22:28:22', '2018-02-13 22:32:19');\nINSERT INTO `departments` VALUES ('2', '人事部', '2018-02-13 22:28:49', null);\nINSERT INTO `departments` VALUES ('3', '财务部', '2018-02-13 22:28:54', null);\nINSERT INTO `departments` VALUES ('4', '市场部', '2018-02-13 22:29:10', null);\nINSERT INTO `departments` VALUES ('5', '开发部', '2018-02-13 22:29:18', null);\n\n-- ----------------------------\n-- Table structure for messages\n-- ----------------------------\nDROP TABLE IF EXISTS `messages`;\nCREATE TABLE `messages` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `title` varchar(255) NOT NULL,\n  `message` text,\n  `send_id` int(11) NOT NULL,\n  `receive_id` int(11) NOT NULL,\n  `is_del` varchar(1) DEFAULT NULL,\n  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of messages\n-- ----------------------------\nINSERT INTO `messages` VALUES ('7', '渣渣', '渣渣渣渣渣渣', '8', '1', null, '2018-02-27 10:10:41', null);\nINSERT INTO `messages` VALUES ('8', '渣渣', '渣渣渣渣渣渣', '8', '1', null, '2018-02-27 10:10:48', null);\nINSERT INTO `messages` VALUES ('9', '渣渣', '渣渣渣渣渣渣', '8', '1', null, '2018-02-27 10:10:51', null);\nINSERT INTO `messages` VALUES ('10', '渣渣', '渣渣渣渣渣渣', '8', '1', null, '2018-02-27 10:10:53', null);\nINSERT INTO `messages` VALUES ('11', '喂喂喂', '喂喂喂喂喂喂喂喂喂喂喂喂', '8', '1', null, '2018-02-27 11:18:06', null);\nINSERT INTO `messages` VALUES ('12', '喂喂喂', '喂喂喂喂喂喂喂喂喂喂喂喂', '8', '1', null, '2018-02-27 11:18:07', null);\nINSERT INTO `messages` VALUES ('13', '喂喂喂', '喂喂喂喂喂喂喂喂喂喂喂喂', '8', '1', null, '2018-02-27 11:18:09', null);\nINSERT INTO `messages` VALUES ('14', '我我我我我我我我我我', '我我我我', '1', '8', null, '2018-02-27 12:08:40', null);\nINSERT INTO `messages` VALUES ('15', '我我我我我我我我我', '我我我我', '1', '8', null, '2018-02-27 12:08:45', null);\nINSERT INTO `messages` VALUES ('16', '你好管理员', '我是你爸爸', '8', '1', null, '2018-02-28 11:27:20', null);\nINSERT INTO `messages` VALUES ('17', '在吗在吗', '我是你爸爸', '8', '1', null, '2018-02-28 11:27:27', null);\nINSERT INTO `messages` VALUES ('18', '黑黑黑', '我是你爸爸', '8', '1', null, '2018-02-28 11:27:34', null);\nINSERT INTO `messages` VALUES ('19', '你好本尊', '再见本尊', '1', '8', null, '2018-02-28 11:34:01', null);\nINSERT INTO `messages` VALUES ('20', '你好本尊123', '再见本尊123', '1', '8', null, '2018-02-28 11:34:05', null);\nINSERT INTO `messages` VALUES ('21', '你好本尊456', '再见本尊456', '1', '8', null, '2018-02-28 11:34:10', null);\nINSERT INTO `messages` VALUES ('22', '维护', '维护123', '8', '1', null, '2018-02-28 16:35:23', null);\nINSERT INTO `messages` VALUES ('23', '管理员大人你好', '管理员大人你好', '10', '1', null, '2018-02-28 17:11:13', null);\nINSERT INTO `messages` VALUES ('24', '你好 请问', '我是谁？我在哪？发生了什么？', '8', '1', null, '2018-03-05 11:05:51', null);\nINSERT INTO `messages` VALUES ('25', '你好 请问', '我是谁？我在哪？发生了什么？', '8', '3', null, '2018-03-05 11:05:51', null);\nINSERT INTO `messages` VALUES ('26', '你好 请问', '我是谁？我在哪？发生了什么？', '8', '7', null, '2018-03-05 11:05:51', null);\nINSERT INTO `messages` VALUES ('27', '你好 请问', '我是谁？我在哪？发生了什么？', '8', '1', null, '2018-03-05 11:05:54', null);\nINSERT INTO `messages` VALUES ('28', '你好 请问', '我是谁？我在哪？发生了什么？', '8', '3', null, '2018-03-05 11:05:54', null);\nINSERT INTO `messages` VALUES ('29', '你好 请问', '我是谁？我在哪？发生了什么？', '8', '7', null, '2018-03-05 11:05:54', null);\nINSERT INTO `messages` VALUES ('30', '你好管理员', 'http://zhangminghui.iok.la/projectoa', '8', '1', null, '2018-03-05 11:06:07', null);\nINSERT INTO `messages` VALUES ('31', '你好管理员', '管理员大人 我的电脑坏了！！！！', '8', '1', null, '2018-03-05 11:06:40', null);\n\n-- ----------------------------\n-- Table structure for notices\n-- ----------------------------\nDROP TABLE IF EXISTS `notices`;\nCREATE TABLE `notices` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `title` varchar(255) NOT NULL,\n  `notice` text,\n  `send_id` int(11) NOT NULL,\n  `is_del` varchar(1) DEFAULT NULL,\n  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of notices\n-- ----------------------------\nINSERT INTO `notices` VALUES ('1', '新年快乐', '新年快乐', '1', null, '2018-02-28 16:24:22', null);\nINSERT INTO `notices` VALUES ('2', '万事如意', '万事如意万事如意万事如意', '1', null, '2018-02-28 16:27:32', null);\nINSERT INTO `notices` VALUES ('3', '大吉大利', '大吉大利', '1', null, '2018-03-01 11:20:18', null);\nINSERT INTO `notices` VALUES ('4', '今晚吃鸡', '今晚吃鸡', '1', null, '2018-03-01 11:20:25', null);\nINSERT INTO `notices` VALUES ('5', '测试一下公告的长度可以有多长', '一二三四五六七九十一二三四五六七九十一二三四五六七九十一二三四五六七九十一二三四五六七九十一二三四五六七九十一二三四五六七九十一二三四五六七九十一二三四五六七九十一二三四五六七九十一二三四五六七九十一二三四五六七九十一二三四五六七九十一二三四五六七九十', '1', null, '2018-03-01 13:12:07', null);\nINSERT INTO `notices` VALUES ('6', '祝大家元宵节快乐', '祝大家元宵节快乐！', '1', null, '2018-03-01 13:45:51', null);\nINSERT INTO `notices` VALUES ('7', '新年快乐', '万事如意', '1', null, '2018-03-01 13:50:44', null);\nINSERT INTO `notices` VALUES ('8', '新年快乐', '万事如意', '1', null, '2018-03-01 13:51:06', null);\nINSERT INTO `notices` VALUES ('9', '重要通知', '2018年3月8日 全公司女同志放假1天', '1', null, '2018-03-05 11:01:37', null);\nINSERT INTO `notices` VALUES ('10', '震惊！', '震惊！公司居然发生如此骇人听闻之事！', '1', null, '2018-03-05 11:02:21', null);\nINSERT INTO `notices` VALUES ('11', '重要通知', '即日起 公司网站正式上线！http://zhangminghui.iok.la/projectoa\\n欢迎访问', '1', null, '2018-03-05 11:03:01', null);\nINSERT INTO `notices` VALUES ('12', '测试', '测试 2018-3-5 11:03:17', '1', null, '2018-03-05 11:03:44', null);\nINSERT INTO `notices` VALUES ('13', '测试测试', '2018年3月5日11:03:36', '1', null, '2018-03-05 11:03:58', null);\nINSERT INTO `notices` VALUES ('14', '测试测', '2018-3-5 11:03:49', '1', null, '2018-03-05 11:04:12', null);\nINSERT INTO `notices` VALUES ('15', '测试测是我才是', '2018年3月5日11:04:02', '1', null, '2018-03-05 11:04:25', null);\nINSERT INTO `notices` VALUES ('16', '喜大普奔！', '本公司女员工三八妇女节 2018年3月8日放假一整天', '1', null, '2018-03-05 11:10:54', null);\n\n-- ----------------------------\n-- Table structure for positions\n-- ----------------------------\nDROP TABLE IF EXISTS `positions`;\nCREATE TABLE `positions` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `position` varchar(255) DEFAULT NULL,\n  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of positions\n-- ----------------------------\nINSERT INTO `positions` VALUES ('1', '管理员', '2018-02-13 22:31:17', '2018-02-13 22:32:11');\nINSERT INTO `positions` VALUES ('2', '经理', '2018-02-13 22:31:45', null);\nINSERT INTO `positions` VALUES ('3', '主管', '2018-02-13 22:31:50', null);\nINSERT INTO `positions` VALUES ('4', '普通', '2018-02-13 22:31:56', null);\n\n-- ----------------------------\n-- Table structure for userinfo\n-- ----------------------------\nDROP TABLE IF EXISTS `userinfo`;\nCREATE TABLE `userinfo` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `user_id` int(11) NOT NULL,\n  `sex` varchar(255) DEFAULT NULL,\n  `birthday` date DEFAULT NULL,\n  `age` int(11) DEFAULT NULL,\n  `identity_card` varchar(255) DEFAULT NULL,\n  `email` varchar(255) DEFAULT NULL,\n  `qq` int(11) DEFAULT NULL,\n  `wechat` varchar(255) DEFAULT NULL,\n  `weibo` varchar(255) DEFAULT NULL,\n  `phone` varchar(255) DEFAULT NULL,\n  `is_del` varchar(1) DEFAULT NULL,\n  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of userinfo\n-- ----------------------------\nINSERT INTO `userinfo` VALUES ('1', '1', '1', '1970-01-02', '39', '310123456789451234', 'admin@projectoa.com', '123456789', '123456789', '123456789', '12345678901', null, '2018-02-13 22:32:56', '2018-03-08 12:54:11');\nINSERT INTO `userinfo` VALUES ('3', '3', '2', '1970-01-01', null, '', '', null, '', '', '', null, '2018-02-14 22:27:04', '2018-03-05 11:09:02');\nINSERT INTO `userinfo` VALUES ('5', '7', '3', '2018-01-30', '25', '222222222222222222', '420120577@qq.com', '420120577', 'weichat', 'weibo', '13919191919', '1', '2018-02-14 22:47:02', '2018-02-25 19:57:25');\nINSERT INTO `userinfo` VALUES ('6', '8', '1', '1992-04-02', '18', '313132121313313', '', null, '', '', '', null, '2018-02-15 13:25:56', '2018-02-26 11:27:44');\nINSERT INTO `userinfo` VALUES ('7', '9', null, null, null, null, null, null, null, null, null, '1', '2018-02-15 13:30:31', '2018-02-26 11:41:07');\nINSERT INTO `userinfo` VALUES ('8', '10', null, null, null, null, null, null, null, null, null, '0', '2018-02-18 11:56:03', '2018-02-22 22:37:31');\nINSERT INTO `userinfo` VALUES ('9', '11', '2', null, null, '', '', null, '', '', '', null, '2018-02-20 22:17:30', '2018-03-02 11:50:22');\nINSERT INTO `userinfo` VALUES ('10', '12', null, null, null, null, null, null, null, null, null, null, '2018-03-02 15:10:42', null);\nINSERT INTO `userinfo` VALUES ('11', '13', null, null, null, null, null, null, null, null, null, null, '2018-03-02 15:10:47', null);\nINSERT INTO `userinfo` VALUES ('12', '14', null, null, null, null, null, null, null, null, null, null, '2018-03-02 15:11:00', null);\nINSERT INTO `userinfo` VALUES ('13', '15', null, null, null, null, null, null, null, null, null, null, '2018-03-02 15:11:03', null);\nINSERT INTO `userinfo` VALUES ('14', '16', null, null, null, null, null, null, null, null, null, null, '2018-03-02 15:11:05', null);\nINSERT INTO `userinfo` VALUES ('15', '17', null, null, null, null, null, null, null, null, null, null, '2018-03-02 15:11:07', null);\nINSERT INTO `userinfo` VALUES ('16', '18', null, null, null, null, null, null, null, null, null, '1', '2018-03-02 15:11:09', '2018-03-02 15:58:27');\n\n-- ----------------------------\n-- Table structure for users\n-- ----------------------------\nDROP TABLE IF EXISTS `users`;\nCREATE TABLE `users` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  `username` varchar(31) NOT NULL,\n  `password` varchar(255) NOT NULL,\n  `realname` varchar(31) NOT NULL,\n  `department_id` int(11) NOT NULL,\n  `position_id` int(11) NOT NULL,\n  `is_del` varchar(1) NOT NULL DEFAULT '0',\n  `last_login_time` timestamp NULL DEFAULT NULL,\n  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;\n\n-- ----------------------------\n-- Records of users\n-- ----------------------------\nINSERT INTO `users` VALUES ('1', 'admin', 'e10adc3949ba59abbe56e057f20f883e', '管理员', '1', '1', '0', '2018-03-17 22:09:30', '2018-02-13 22:32:48', '2018-03-17 22:09:29');\nINSERT INTO `users` VALUES ('3', 'chengshanyunduo', 'e10adc3949ba59abbe56e057f20f883e', '程杉耘朵', '2', '4', '0', '2018-03-05 11:08:38', '2018-02-14 22:27:04', '2018-03-05 11:09:32');\nINSERT INTO `users` VALUES ('7', 'csyd1028', 'e10adc3949ba59abbe56e057f20f883e', '耘朵', '2', '2', '1', null, '2018-02-14 22:47:02', '2018-03-01 13:49:17');\nINSERT INTO `users` VALUES ('8', 'zhangminghui', 'e10adc3949ba59abbe56e057f20f883e', '张明辉', '3', '3', '0', '2018-03-08 16:14:12', '2018-02-15 13:25:56', '2018-03-08 16:14:12');\nINSERT INTO `users` VALUES ('9', 'zmh0403', 'e10adc3949ba59abbe56e057f20f883e', '张大大', '2', '1', '0', '2018-03-01 13:18:30', '2018-02-15 13:30:31', '2018-03-01 13:18:29');\nINSERT INTO `users` VALUES ('10', 'zhangdabao', 'e10adc3949ba59abbe56e057f20f883e', '张大宝', '5', '4', '0', '2018-03-01 13:22:16', '2018-02-18 11:56:02', '2018-03-01 13:22:16');\nINSERT INTO `users` VALUES ('11', 'csyd11', 'e10adc3949ba59abbe56e057f20f883e', '程宝宝', '4', '3', '0', '2018-03-02 11:50:12', '2018-02-20 22:17:30', '2018-03-02 11:50:11');\nINSERT INTO `users` VALUES ('12', 'testman', 'e10adc3949ba59abbe56e057f20f883e', '张三', '1', '1', '0', '2018-03-02 15:12:31', '2018-03-02 15:10:41', '2018-03-05 10:16:23');\nINSERT INTO `users` VALUES ('13', 'testman123', 'e10adc3949ba59abbe56e057f20f883e', '李四', '5', '4', '0', null, '2018-03-02 15:10:47', '2018-03-05 10:16:26');\nINSERT INTO `users` VALUES ('14', 'testman1', 'e10adc3949ba59abbe56e057f20f883e', '王五', '5', '4', '0', null, '2018-03-02 15:11:00', '2018-03-05 10:16:29');\nINSERT INTO `users` VALUES ('15', 'testman11', 'e10adc3949ba59abbe56e057f20f883e', '赵六', '5', '4', '0', null, '2018-03-02 15:11:02', '2018-03-05 10:16:35');\nINSERT INTO `users` VALUES ('16', 'testman111', 'e10adc3949ba59abbe56e057f20f883e', '测试员', '5', '4', '0', null, '2018-03-02 15:11:05', '2018-03-05 10:16:40');\nINSERT INTO `users` VALUES ('17', 'testman1111', 'e10adc3949ba59abbe56e057f20f883e', '测试员', '2', '4', '0', null, '2018-03-02 15:11:07', '2018-03-11 10:44:16');\nINSERT INTO `users` VALUES ('18', 'testman11111', 'e10adc3949ba59abbe56e057f20f883e', '测试员', '5', '4', '1', null, '2018-03-02 15:11:09', '2018-03-05 10:16:44');\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-3.5.1-bin.zip\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave ( ) {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windows variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/ProjectoaApplication.java",
    "content": "package com.zmh.projectoa;\n\nimport de.codecentric.boot.admin.config.EnableAdminServer;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n\n@SpringBootApplication\n@EnableAdminServer\npublic class ProjectoaApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(ProjectoaApplication.class, args);\n\t}\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/ServletInitializer.java",
    "content": "package com.zmh.projectoa;\n\nimport org.springframework.boot.builder.SpringApplicationBuilder;\nimport org.springframework.boot.web.support.SpringBootServletInitializer;\n\npublic class ServletInitializer extends SpringBootServletInitializer {\n\n\t@Override\n\tprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {\n\t\treturn application.sources(ProjectoaApplication.class);\n\t}\n\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/config/MyShiroRealm.java",
    "content": "package com.zmh.projectoa.config;\n\nimport com.zmh.projectoa.model.Users;\nimport com.zmh.projectoa.service.UsersService;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.apache.shiro.SecurityUtils;\nimport org.apache.shiro.authc.*;\nimport org.apache.shiro.authz.AuthorizationInfo;\nimport org.apache.shiro.authz.SimpleAuthorizationInfo;\nimport org.apache.shiro.realm.AuthorizingRealm;\nimport org.apache.shiro.subject.PrincipalCollection;\nimport org.springframework.beans.factory.annotation.Autowired;\n\nimport java.util.HashSet;\nimport java.util.Objects;\nimport java.util.Set;\n\n\n/**\n * shiro的认证最终是交给了Realm进行执行\n * 所以我们需要自己重新实现一个Realm，此Realm继承AuthorizingRealm\n * Created by sun on 2017-4-2.\n */\npublic class MyShiroRealm extends AuthorizingRealm {\n\n    private static final Log logger = LogFactory.getLog(MyShiroRealm.class);\n\n    @Autowired\n    UsersService usersService;\n\n    /**\n     * 登录认证\n     */\n    @Override\n    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {\n        //1.把AuthenticationToken转换为UsernamePasswordToken\n        UsernamePasswordToken upToken = (UsernamePasswordToken) authenticationToken;\n        //2.从UsernamePasswordToken中来获取username\n        String username = upToken.getUsername();\n        //3.调用数据库的方法， 从数据库中查询username对应的用户记录\n        Users temp = new Users();\n        temp.setUsername(username);\n        Users user = usersService.queryUserByUsername(temp);\n        //4.若用户不存在， 则可抛出UnknownAccountException异常\n        if (Objects.isNull(user)){\n            throw new UnknownAccountException(\"用户不存在\");\n        }\n        //5.根据用户信息的情况，决定是否需要抛出其他的AuthenticationException异常\n        if (\"1\".equals(user.getIsDel())){\n            throw new LockedAccountException(\"用户状态异常\");\n        }\n        //6.根据用户的情况， 来构建AuthenticationInfo对象并返回， 通常使用的实现类为：SimpleAuthenticationInfo\n        //以下信息是从数据库中获取的\n        //1.principal:认证的实体信息，可以是username，也可以是数表对应的实体类对象\n        Object principal = user;\n        //2.creadentials： 密码\n        //String pw = MD5Util.string2MD5(\"123456\");\n        Object credentials = user.getPassword();\n        //3. realName: 当前对象的name，调用弗雷的getName()方法即可\n        String realmName = user.getRealname();\n        SecurityUtils.getSubject().getSession().setAttribute(\"user\", user);\n        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(principal, credentials, realmName);\n        return info;\n    }\n\n    /**\n     * 权限认证（为当前登录的Subject授予角色和权限）\n     *\n     * 该方法的调用时机为需授权资源被访问时，并且每次访问需授权资源都会执行该方法中的逻辑，这表明本例中并未启用AuthorizationCache，\n     * 如果连续访问同一个URL（比如刷新），该方法不会被重复调用，Shiro有一个时间间隔（也就是cache时间，在ehcache-shiro.xml中配置），\n     * 超过这个时间间隔再刷新页面，该方法会被执行\n     *\n     * doGetAuthorizationInfo()是权限控制，\n     * 当访问到页面的时候，使用了相应的注解或者shiro标签才会执行此方法否则不会执行，\n     * 所以如果只是简单的身份认证没有权限的控制的话，那么这个方法可以不进行实现，直接返回null即可\n     *\n     * 简单来说这个方法的功能就是赋权\n     * 根据数据库里面的分类\n     * 不同的用户类型给与不同的权限\n     * 前后端会根据这里的权限，进行智能的显示其对应的页面和功能\n     * 如果强行访问无权访问的url也会被弹开\n     *\n     * 这里是按照一个简单粗暴的方式分权\n     * admin享有一切权限\n     *\n     * 人事的所有人都可以管理人员信息\n     * 经理及以上可以允许发送公告的行为\n     */\n    @Override\n    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {\n        //0.创建SimpleAuthorizationInfo\n        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();\n        //1.从PrincipalCollection中获取登陆用户的信息\n        Object principal = principals.getPrimaryPrincipal();\n        //2.利用登陆用户的信息来获取当前用户的角色或权限（可能需要查询数据库）\n        Users user = (Users) principal;\n        //存放角色的set\n        Set<String> roles = new HashSet<>();\n        Integer departmentId = user.getDepartmentId();\n        Integer positionId = user.getPositionId();\n        //管理员角色\n        if (departmentId == 1){\n            roles.add(\"admin\");\n            roles.add(\"user\");\n        }\n        //人事角色\n        if (departmentId == 2){\n            roles.add(\"user\");\n        }\n        info.setRoles(roles);\n\n        //存放具体的行为的set\n        Set<String> permissions = new HashSet<String>();\n        //只有管理员或者经理，才允许发送公告\n        if(positionId == 1 || positionId == 2){\n            permissions.add(\"notice\");\n        }\n        info.setStringPermissions(permissions);\n\n\n        return info;\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/config/ShiroConfiguration.java",
    "content": "package com.zmh.projectoa.config;\n\nimport at.pollux.thymeleaf.shiro.dialect.ShiroDialect;\nimport org.apache.commons.logging.Log;\nimport org.apache.commons.logging.LogFactory;\nimport org.apache.shiro.authc.credential.HashedCredentialsMatcher;\nimport org.apache.shiro.spring.LifecycleBeanPostProcessor;\nimport org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;\nimport org.apache.shiro.spring.web.ShiroFilterFactoryBean;\nimport org.apache.shiro.web.mgt.DefaultWebSecurityManager;\nimport org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.transaction.annotation.EnableTransactionManagement;\n\nimport java.util.LinkedHashMap;\nimport java.util.Map;\n\n/**\n * Created by ChengShanyunduo\n * 2018/1/8\n */\n@Configuration\n@EnableTransactionManagement\npublic class ShiroConfiguration {\n\n\n    private final Log logger = LogFactory.getLog(ShiroConfiguration.class);\n\n\n    @Bean(name = \"myShiroRealm\")\n    public MyShiroRealm myShiroRealm(){\n        MyShiroRealm realm = new MyShiroRealm();\n        //前台输入的为mD5加密的\n        HashedCredentialsMatcher md5 = new HashedCredentialsMatcher(\"MD5\");\n        realm.setCredentialsMatcher(md5);\n        return realm;\n    }\n\n    @Bean(name = \"lifecycleBeanPostProcessor\")\n    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor(){\n        return new LifecycleBeanPostProcessor();\n    }\n\n    @Bean\n    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator(){\n        DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator();\n        creator.setProxyTargetClass(true);\n        return creator;\n    }\n\n    @Bean(name = \"securityManager\")\n    public DefaultWebSecurityManager defaultWebSecurityManager(MyShiroRealm realm){\n        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();\n        //设置realm,多个realm可以用securityManager.setRealms();\n        securityManager.setRealm(realm);\n        //设置认证策略\n        //ModularRealmAuthenticator authenticator = new ModularRealmAuthenticator();\n        //authenticator.setAuthenticationStrategy(new AtLeastOneSuccessfulStrategy());\n        //securityManager.setAuthenticator(authenticator);\n        return securityManager;\n    }\n\n    @Bean\n    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager){\n        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();\n        advisor.setSecurityManager(securityManager);\n        return advisor;\n    }\n\n    //shirofilter，使用springboot时name可以随设置，不需要context设置，\n    @Bean(name = \"shiroFilter\")\n    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager){\n        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();\n        factoryBean.setSecurityManager(securityManager);\n        // 如果不设置默认会自动寻找Web工程根目录下的\"/login.jsp\"页面\n        //登录页面（请求）\n        factoryBean.setLoginUrl(\"/login\");\n        // 登录成功后要跳转的连接  （请求）\n        factoryBean.setSuccessUrl(\"/index\");\n        //没有权限页面\n        factoryBean.setUnauthorizedUrl(\"/403\");\n        loadShiroFilterChain(factoryBean);\n        return factoryBean;\n    }\n\n    @Bean\n    public ShiroDialect shiroDialect() {\n        return new ShiroDialect();\n    }\n\n    /**\n     * 加载ShiroFilter权限控制规则\n     * 这块代码是负责拦截的\n     * 也就是说，如果当前登陆的人，不符合访问某个url的访问权限条件的，直接给他弹开\n     * 也就是分配谁能访问谁\n     */\n    private void loadShiroFilterChain(ShiroFilterFactoryBean factoryBean) {\n        /**下面这些规则配置最好配置到配置文件中*/\n        Map<String, String> filterChainMap = new LinkedHashMap<String, String>();\n        Map<String, String> filterChainMapTemp = new LinkedHashMap<String, String>();\n        /** authc：该过滤器下的页面必须验证后才能访问，它是Shiro内置的一个拦截器\n         * org.apache.shiro.web.filter.authc.FormAuthenticationFilter */\n        // anon：它对应的过滤器里面是空的,什么都没做,可以理解为不拦截  \n        //authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问\n        //暂时没有好的办法解决shiro和sba冲突问题， 暂时使用新的shiro配置方案\n\n        filterChainMap.put(\"/login\", \"anon\");\n        filterChainMap.put(\"/login/check\", \"anon\");\n        filterChainMap.put(\"/403\", \"anon\");\n        filterChainMap.put(\"/assets/**\", \"anon\");\n        filterChainMap.put(\"/js/**\", \"anon\");\n        filterChainMap.put(\"/prism/**\", \"anon\");\n        //给SpringBootAdmin开启权限\n        filterChainMap.put(\"/monitor/**\", \"anon\");\n        filterChainMap.put(\"/api/**\", \"anon\");\n        filterChainMap.put(\"/health/**\", \"anon\");\n        //权限分配\n        filterChainMap.put(\"/admin/**\", \"authc,roles[admin]\");\n        filterChainMap.put(\"/user/**\", \"authc,roles[user]\");\n\n        //行为分配\n        filterChainMap.put(\"/notice/notice_create\", \"authc,perms[notice]\");\n        filterChainMap.put(\"/notice/notice_send\", \"authc,perms[notice]\");\n\n        //登出的过滤器\n        filterChainMap.put(\"/logout\", \"logout\");\n\n        filterChainMap.put(\"/**\", \"authc\");\n\n\n        /**\n         * 为了放行Spring Boot Admin\n         * 这里启用临时方案 PlanB\n         * 将shiro倒过来使用\n         * 所有使用到的页面都加密成需要登陆才能访问\n         * 其余所有一律采取不拦截\n         */\n        filterChainMapTemp.put(\"/notice/notice_create\", \"authc,perms[notice]\");\n        filterChainMapTemp.put(\"/notice/notice_send\", \"authc,perms[notice]\");\n        filterChainMapTemp.put(\"/js/**\", \"authc\");\n        filterChainMapTemp.put(\"/index/**\", \"authc\");\n        filterChainMapTemp.put(\"/user/**\", \"authc,roles[user]\");\n        filterChainMapTemp.put(\"/userinfo/**\", \"authc\");\n        filterChainMapTemp.put(\"/calendar/**\", \"authc\");\n        filterChainMapTemp.put(\"/admin/**\", \"authc,roles[admin]\");\n        filterChainMapTemp.put(\"/message/**\", \"authc\");\n        filterChainMapTemp.put(\"/notice/**\", \"authc\");\n        filterChainMapTemp.put(\"/logout\", \"logout\");\n\n        filterChainMapTemp.put(\"/**\",\"anon\");\n        factoryBean.setFilterChainDefinitionMap(filterChainMapTemp);\n    }  \n  \n    /*1.LifecycleBeanPostProcessor，这是个DestructionAwareBeanPostProcessor的子类，负责org.apache.shiro.util.Initializable类型bean的生命周期的，初始化和销毁。主要是AuthorizingRealm类的子类，以及EhCacheManager类。  \n    2.HashedCredentialsMatcher，这个类是为了对密码进行编码的，防止密码在数据库里明码保存，当然在登陆认证的生活，这个类也负责对form里输入的密码进行编码。  \n    3.ShiroRealm，这是个自定义的认证类，继承自AuthorizingRealm，负责用户的认证和权限的处理，可以参考JdbcRealm的实现。  \n    4.EhCacheManager，缓存管理，用户登陆成功后，把用户信息和权限信息缓存起来，然后每次用户请求时，放入用户的session中，如果不设置这个bean，每个请求都会查询一次数据库。  \n    5.SecurityManager，权限管理，这个类组合了登陆，登出，权限，session的处理，是个比较重要的类。  \n    6.ShiroFilterFactoryBean，是个factorybean，为了生成ShiroFilter。它主要保持了三项数据，securityManager，filters，filterChainDefinitionManager。  \n    7.DefaultAdvisorAutoProxyCreator，Spring的一个bean，由Advisor决定对哪些类的方法进行AOP代理。  \n    8.AuthorizationAttributeSourceAdvisor，shiro里实现的Advisor类，内部使用AopAllianceAnnotationsAuthorizingMethodInterceptor来拦截用以下注解的方法。*/\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/controller/AdminController.java",
    "content": "package com.zmh.projectoa.controller;\n\nimport com.zmh.projectoa.dto.ReturnDto;\nimport com.zmh.projectoa.util.ReadFileUtil;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\n/**\n * @author zmh\n * @date 2018/2/18 16:24\n * 在页面标签栏里显示日志文件\n */\n@Controller\n@RequestMapping(value = \"/admin\")\npublic class AdminController {\n    //这两个参数从application.properties获取\n    @Value(\"${logback.filepath}\")\n    private String filePath;\n    @Value(\"${logback.charset}\")\n    private String charSet;\n\n    /**\n     * 获取所有日志文件的文件名\n     * @return\n     */\n    @RequestMapping(value = \"/getFileNames\")\n    @ResponseBody\n    public ReturnDto getFileNames(){\n        return ReadFileUtil.getFileName(filePath);\n    }\n\n    /**\n     * 获取所有日志文件的文件名\n     * @return\n     */\n    @RequestMapping(value = \"/readFiles\")\n    @ResponseBody\n    public ReturnDto readFiles(@RequestParam(\"fileName\")String fileName){\n        return ReadFileUtil.readFileByLines(filePath,fileName,charSet);\n    }\n\n\n    /**\n     * 日志\n     */\n    @RequestMapping(value = \"/logs\")\n    public String logs(){\n        return \"logs\";\n    }\n    /**\n     * 系统监控\n     */\n    @RequestMapping(value = \"/springbootadmin\")\n    public String springbootadmin(){\n        return \"springbootadmin\";\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/controller/CalendarController.java",
    "content": "package com.zmh.projectoa.controller;\n\nimport com.zmh.projectoa.dto.ReturnDto;\nimport com.zmh.projectoa.service.RedisService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport javax.servlet.http.HttpServletRequest;\n\n@Controller\npublic class CalendarController {\n    @Autowired\n    private RedisService redisService;\n\n    /**\n     * 日历\n     */\n    @RequestMapping(value = \"/calendar\")\n    public String calendar() {\n        return \"calendar\";\n    }\n\n    /**\n     * 缓存日志备注\n     * key是 calendar加userID\n     * value是 JSON格式备注\n     */\n    @RequestMapping(value = \"/calendarSetValue\")\n    @ResponseBody\n    public ReturnDto calendarSetValue(@RequestParam(\"value\") String value, HttpServletRequest request) {\n        String key = \"calendar_\" + request.getSession().getAttribute(\"userID\");\n        redisService.setValue(key, value);\n        return ReturnDto.buildSuccessReturnDto();\n    }\n\n    /**\n     * 获取日志备注\n     * key是 calendar加userID\n     * return是 JSON格式备注\n     */\n    @RequestMapping(value = \"/calendarGetValue\")\n    @ResponseBody\n    public ReturnDto calendarGetValue(HttpServletRequest request) {\n        String key = \"calendar_\" + request.getSession().getAttribute(\"userID\");\n        String value = redisService.getValue(key);\n        if (value != null) {\n            return ReturnDto.buildSuccessReturnDto(value);\n        } else {\n            return ReturnDto.buildFailedReturnDto(\"value is null\");\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/controller/DepartmentController.java",
    "content": "package com.zmh.projectoa.controller;\n\nimport com.zmh.projectoa.dto.ReturnDto;\nimport com.zmh.projectoa.model.Departments;\nimport com.zmh.projectoa.service.DepartmentService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport java.util.List;\n\n/**\n * Created by ChengShanyunduo\n * 2018/2/14\n */\n@Controller\n@RequestMapping(\"/department\")\npublic class DepartmentController {\n\n    @Autowired\n    DepartmentService departmentService;\n\n    /**\n     * 查询部门\n     * @return\n     */\n    @RequestMapping(value = \"/query\")\n    @ResponseBody\n    public ReturnDto queryDepartment(){\n        List<Departments> departments = departmentService.queryDepartment();\n        return ReturnDto.buildSuccessReturnDto(departments);\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/controller/IndexController.java",
    "content": "package com.zmh.projectoa.controller;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\n/**\n * @Author: ZMH \n * @Date: 2018/2/9 22:49\n * 主页的Controller\n */\n@Controller\npublic class IndexController {\n    /**\n     * 登陆跳转\n     */\n    @RequestMapping(value = \"/\")\n    public String in(){\n        return \"login\";\n    }\n    /**\n     * 主页\n     */\n    @RequestMapping(value = \"/index\")\n    public String index(){\n        return \"index\";\n    }\n\n    /**\n     * 没有权限访问\n     */\n    @RequestMapping(value = \"/403\")\n    public String error403(){\n        return \"403\";\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/controller/LoginController.java",
    "content": "package com.zmh.projectoa.controller;\n\nimport com.zmh.projectoa.dto.ReturnDto;\nimport com.zmh.projectoa.model.Users;\nimport com.zmh.projectoa.service.UsersService;\nimport org.apache.shiro.SecurityUtils;\nimport org.apache.shiro.authc.AuthenticationException;\nimport org.apache.shiro.authc.IncorrectCredentialsException;\nimport org.apache.shiro.authc.UsernamePasswordToken;\nimport org.apache.shiro.subject.Subject;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.Date;\n\n/**\n * @Author: ZMH\n * @Date: 2018/2/9 22:48\n * 登陆Controller\n */\n@Controller\npublic class LoginController {\n    Logger logger = LoggerFactory.getLogger(LoginController.class.getName());\n    @Autowired\n    UsersService usersService;\n\n    @RequestMapping(value = \"/login\")\n    public String login(){\n        return \"login\";\n    }\n\n    @RequestMapping(value = \"/login/check\")\n    //@ResponseBody\n    public String check(@RequestParam(\"username\")String username, @RequestParam(\"password\")String password,\n                        HttpServletRequest request){\n        Subject currentUser = SecurityUtils.getSubject();\n        if (!currentUser.isAuthenticated()){\n            UsernamePasswordToken token = new UsernamePasswordToken(username, password);\n            try {\n                currentUser.login(token);\n                Users user = (Users)currentUser.getPrincipals().getPrimaryPrincipal();\n                Integer id = user.getId();\n                user = new Users();\n                user.setLastLoginTime(new Date());\n                request.getSession().setAttribute(\"userID\",id);\n                usersService.editUser(id,user);\n            }catch (IncorrectCredentialsException ae){\n                logger.error(\"登录验证不通过 : 账号或密码不正确！ username:\"+username+\" password:\"+password);\n            }\n            catch (AuthenticationException ae){\n                logger.error(\"登录验证不通过 : \" + ae.getMessage());\n            }\n        }\n        return \"redirect:/index\";\n        //return ReturnDto.buildSuccessReturnDto(\"\");\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/controller/MessageController.java",
    "content": "package com.zmh.projectoa.controller;\n\nimport com.zmh.projectoa.dto.ReturnDto;\nimport com.zmh.projectoa.model.Messages;\nimport com.zmh.projectoa.service.MessageService;\nimport com.zmh.projectoa.service.RedisService;\nimport com.zmh.projectoa.service.UsersService;\nimport com.zmh.projectoa.util.JSONUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\n\n/**\n * @author zmh\n * @date 2018/2/1521:41\n * 站内信\n */\n@Controller\n@RequestMapping(value = \"/message\")\npublic class MessageController {\n    @Autowired\n    UsersService usersService;\n    @Autowired\n    MessageService messageService;\n    @Autowired\n    RedisService redisService;\n\n    /**\n     * 站内信箱\n     */\n    @RequestMapping(value = \"/message\")\n    public String message() {\n        return \"message\";\n    }\n\n    /**\n     * 站内信详情\n     */\n    @RequestMapping(value = \"/message_dtl/{id}\")\n    public String message_dtl() {\n        return \"message_dtl\";\n    }\n\n    /**\n     * 发送站内信\n     */\n    @RequestMapping(value = \"/send_message\")\n    @ResponseBody\n    public ReturnDto sendMessage(@RequestParam(\"userIDs\") String userIDs, @RequestParam(\"title\") String title,\n                                 @RequestParam(\"message\") String message, HttpServletRequest request) {\n        String userID[] = userIDs.split(\",\");\n        Integer sendId = (Integer) request.getSession().getAttribute(\"userID\");\n        for (String receiveId : userID) {\n            Messages messages = new Messages();\n            messages.setSendId(sendId);\n            messages.setReceiveId(Integer.parseInt(receiveId));\n            messages.setTitle(title);\n            messages.setMessage(message);\n            int messageID = messageService.insertMessage(messages);\n            String unReadMessageIDs = redisService.getValue(\"message_\" + receiveId);\n            if (Objects.isNull(unReadMessageIDs) || \"null\".equals(unReadMessageIDs))\n                unReadMessageIDs = String.valueOf(messageID);\n            else\n                unReadMessageIDs += \",\" + messageID;\n            redisService.setValue(\"message_\" + receiveId, unReadMessageIDs);\n        }\n        return ReturnDto.buildSuccessReturnDto(\"success\");\n    }\n\n    /**\n     * 返回特别定制的所有用户信息给用户选择站内信发给谁\n     */\n    @RequestMapping(value = \"/getAllUser\")\n    @ResponseBody\n    public ReturnDto getAllUser(HttpServletRequest request) {\n        Integer id = (Integer) request.getSession().getAttribute(\"userID\");\n        return usersService.getAllUser(id);\n    }\n\n    /**\n     * 获取本人未读信息\n     */\n    @RequestMapping(value = \"/getUnReadMessages\")\n    @ResponseBody\n    public ReturnDto getUnReadMessages(HttpServletRequest request) {\n        Integer id = (Integer) request.getSession().getAttribute(\"userID\");\n        //这里的思路是去redis取message_+'本人id'为key的value 里面包含所有未读messageID\n        String unReadMessageIDs = redisService.getValue(\"message_\" + id);\n        //取出来是空直接跳过 标准格式是10,22,44 代表未读messageID\n        if (!Objects.isNull(unReadMessageIDs) && !\"null\".equals(unReadMessageIDs) && unReadMessageIDs.length() > 0) {\n            List<Integer> list = JSONUtil.String2List(unReadMessageIDs);\n            //返回一个list<map> map包括发件人姓名 和 message的 id titile\n            List<Map<String, String>> selectByIDs = messageService.selectByIDs(list);\n            return ReturnDto.buildSuccessReturnDto(selectByIDs);\n        }\n        return ReturnDto.buildFailedReturnDto(\"数据异常\");\n    }\n\n    /**\n     * 设为已读\n     * 从redis中剔除这条\n     */\n    @RequestMapping(value = \"/setIsRead\")\n    @ResponseBody\n    public ReturnDto setIsRead(@RequestParam(\"id\") Integer messageID, HttpServletRequest request) {\n        Integer userID = (Integer) request.getSession().getAttribute(\"userID\");\n        List<Integer> list = new ArrayList<>();\n        String unReadMessageIDs = redisService.getValue(\"message_\" + userID);\n        //取出来是空直接跳过 标准格式是10,22,44 代表未读messageID\n        if (!Objects.isNull(unReadMessageIDs) && !\"null\".equals(unReadMessageIDs)) {\n            list = JSONUtil.String2List(unReadMessageIDs);\n        }\n        if(!list.contains(messageID))\n            return ReturnDto.buildFailedReturnDto(\"这条信息不存在\");\n        list.remove(messageID);\n        unReadMessageIDs = JSONUtil.List2String(list);\n        redisService.setValue(\"message_\" + userID, unReadMessageIDs);\n        return ReturnDto.buildSuccessReturnDto(\"success\");\n    }\n\n    /**\n     * 本人所有接收到的信\n     */\n    @RequestMapping(value = \"/getMessages\")\n    @ResponseBody\n    public ReturnDto getMessages(HttpServletRequest request) {\n        Integer id = (Integer) request.getSession().getAttribute(\"userID\");\n        Integer pageNum;\n        try {\n            pageNum = Integer.parseInt(request.getParameter(\"pageNum\"));\n        }catch (Exception e){\n            pageNum = 1;\n        }\n\n        return ReturnDto.buildSuccessReturnDto(messageService.selectByreceiveID(id, pageNum));\n    }\n\n    /**\n     * 返回某一条详细信息\n     * 新增判断这条信息是否属于这个人\n     */\n    @RequestMapping(value = \"/getMessageDtl\")\n    @ResponseBody\n    public ReturnDto checkMessage(@RequestParam(\"id\") Integer id, HttpServletRequest request) {\n        Integer userID = (Integer) request.getSession().getAttribute(\"userID\");\n        Messages message = messageService.selectByID(id);\n        if(userID != null && message != null && !\"\".equals(userID)\n                && userID.intValue() == message.getReceiveId().intValue())\n            return ReturnDto.buildSuccessReturnDto(message);\n\n        return ReturnDto.buildFailedReturnDto(\"没有权限\");\n    }\n\n    /**\n     * 传入ID 返回发件人\n     */\n    @RequestMapping(value = \"/getSendUserName\")\n    @ResponseBody\n    public ReturnDto getSendUserName(@RequestParam(\"id\") Integer id) {\n        return ReturnDto.buildSuccessReturnDto(usersService.detailUser(id).getRealname());\n    }\n\n    /**\n     * 最后一条信息\n     */\n    @RequestMapping(value = \"/getLastMessage\")\n    @ResponseBody\n    public ReturnDto getLastMessage(HttpServletRequest request) {\n        Integer id = (Integer) request.getSession().getAttribute(\"userID\");\n        return ReturnDto.buildSuccessReturnDto(messageService.getLastMessage(id));\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/controller/NoticeController.java",
    "content": "package com.zmh.projectoa.controller;\n\nimport com.zmh.projectoa.dto.ReturnDto;\nimport com.zmh.projectoa.model.Notices;\nimport com.zmh.projectoa.model.Users;\nimport com.zmh.projectoa.service.NoticeService;\nimport com.zmh.projectoa.service.RedisService;\nimport com.zmh.projectoa.service.UsersService;\nimport com.zmh.projectoa.util.JSONUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\n\n/**\n * @author zmh\n * @date 2018/2/1521:41\n * 公告板\n */\n@Controller\n@RequestMapping(\"/notice\")\npublic class NoticeController {\n    @Autowired\n    private NoticeService noticeService;\n    @Autowired\n    private RedisService redisService;\n    @Autowired\n    private UsersService usersService;\n\n    /**\n     * 通知公告\n     */\n    @RequestMapping(value = \"/notice\")\n    public String notice() {\n        return \"notice\";\n    }\n\n    /**\n     * 新建公告\n     */\n    @RequestMapping(value = \"/notice_create\")\n    public String createNotice() {\n        return \"notice_create\";\n    }\n\n    /**\n     * 公告详情\n     */\n    @RequestMapping(value = \"/notice_dtl/{id}\")\n    public String message_dtl() {\n        return \"notice_dtl\";\n    }\n\n    /**\n     * 发送站内信\n     * 这里接收到站内信后\n     * 存数据库\n     * 加入所有人的redis\n     */\n    @RequestMapping(value = \"/send_notice\")\n    @ResponseBody\n    public ReturnDto sendNotice(@RequestParam(\"title\") String title, @RequestParam(\"notice\") String notice, HttpServletRequest request) {\n        Integer userID = (Integer) request.getSession().getAttribute(\"userID\");\n        Notices notices = new Notices();\n        notices.setSendId(userID);\n        notices.setTitle(title);\n        notices.setNotice(notice);\n        //这里返回的是数据库里的noticeID\n        Integer noticeID = noticeService.insertNotice(notices);\n        //再存入所有人的redis\n        List<Users> usersList = usersService.getAllUsers();\n        for (Users user : usersList) {\n            List<Integer> list = JSONUtil.String2List(redisService\n                    .getValue(\"notice_\" + user.getId()));\n            list.add(noticeID);\n            redisService.setValue(\"notice_\" + user.getId(), JSONUtil.List2String(list));\n        }\n        return ReturnDto.buildSuccessReturnDto(\"success\");\n    }\n\n    /**\n     * 获取本人未读信息\n     */\n    @RequestMapping(value = \"/getUnReadNotices\")\n    @ResponseBody\n    public ReturnDto getUnReadNotices(HttpServletRequest request) {\n        Integer userID = (Integer) request.getSession().getAttribute(\"userID\");\n        //这里的思路是去redis取message_+'本人id'为key的value 里面包含所有未读messageID\n        String unReadNotices = redisService.getValue(\"notice_\" + userID);\n        //取出来是空直接跳过 标准格式是10,22,44 代表未读messageID\n        List<Integer> list = JSONUtil.String2List(unReadNotices);\n        //返回一个list<map> map包括发件人姓名 和 notice id titile\n        if (list != null && list.size() > 0) {\n            List<Map<String, String>> selectByIDs = noticeService.selectByIDs(list);\n            return ReturnDto.buildSuccessReturnDto(selectByIDs);\n        }\n        return ReturnDto.buildFailedReturnDto(\"数据异常\");\n    }\n\n    /**\n     * 本人所有接收到的信\n     */\n    @RequestMapping(value = \"/getNotices\")\n    @ResponseBody\n    public ReturnDto getNotices(@RequestParam(value = \"pageNum\") Integer pageNum) {\n        return ReturnDto.buildSuccessReturnDto(noticeService.getAllNotices(pageNum));\n    }\n\n    /**\n     * 返回某一条详细信息\n     */\n    @RequestMapping(value = \"/getNoticeDtl\")\n    @ResponseBody\n    public ReturnDto checkMessage(@RequestParam(\"id\") Integer id) {\n        Notices notices = noticeService.selectByID(id);\n        return ReturnDto.buildSuccessReturnDto(notices);\n    }\n\n\n    /**\n     * 设为已读\n     * 从redis中剔除这条\n     */\n    @RequestMapping(value = \"/setIsRead\")\n    @ResponseBody\n    public ReturnDto setIsRead(@RequestParam(\"id\") Integer noticeID, HttpServletRequest request) {\n        Integer userID = (Integer) request.getSession().getAttribute(\"userID\");\n        List<Integer> list = new ArrayList<>();\n        String unReadNoticeIDs = redisService.getValue(\"notice_\" + userID);\n        //取出来是空直接跳过 标准格式是10,22,44 代表未读messageID\n        if (!Objects.isNull(unReadNoticeIDs) && !\"null\".equals(unReadNoticeIDs)) {\n            list = JSONUtil.String2List(unReadNoticeIDs);\n        }\n        if(!list.contains(noticeID))\n            return ReturnDto.buildFailedReturnDto(\"这条信息不存在\");\n        list.remove(noticeID);\n        unReadNoticeIDs = JSONUtil.List2String(list);\n        redisService.setValue(\"notice_\" + userID, unReadNoticeIDs);\n        return ReturnDto.buildSuccessReturnDto(\"success\");\n    }\n\n    /**\n     * 最后一条公告\n     */\n    @RequestMapping(value = \"/getLastNotice\")\n    @ResponseBody\n    public ReturnDto getLastMessage() {\n        return ReturnDto.buildSuccessReturnDto(noticeService.getLastNotice());\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/controller/PositionController.java",
    "content": "package com.zmh.projectoa.controller;\n\nimport com.zmh.projectoa.dto.ReturnDto;\nimport com.zmh.projectoa.model.Positions;\nimport com.zmh.projectoa.service.PositionService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport java.util.List;\n\n/**\n * Created by ChengShanyunduo\n * 2018/2/14\n */\n@Controller\n@RequestMapping(\"/position\")\npublic class PositionController {\n\n    @Autowired\n    PositionService positionService;\n\n    /**\n     * 查询职位\n     * @return\n     */\n    @RequestMapping(value = \"/query\")\n    @ResponseBody\n    public ReturnDto queryPosition(){\n        List<Positions> positions = positionService.queryPosition();\n        return ReturnDto.buildSuccessReturnDto(positions);\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/controller/UserinfoController.java",
    "content": "package com.zmh.projectoa.controller;\n\nimport com.zmh.projectoa.dto.ReturnDto;\nimport com.zmh.projectoa.model.Userinfo;\nimport com.zmh.projectoa.model.Users;\nimport com.zmh.projectoa.service.RedisService;\nimport com.zmh.projectoa.service.UserinfoService;\nimport com.zmh.projectoa.service.UsersService;\nimport com.zmh.projectoa.util.MD5Util;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.ResponseBody;\n\nimport javax.servlet.http.HttpServletRequest;\n\n/**\n * Created by ChengShanyunduo\n * 2018/2/25\n */\n@Controller\n@RequestMapping(\"/userinfo\")\npublic class UserinfoController {\n    Logger logger = LoggerFactory.getLogger(LoginController.class.getName());\n\n    @Autowired\n    UserinfoService userinfoService;\n\n    @Autowired\n    UsersService usersService;\n\n    @Autowired\n    RedisService redisService;\n\n    /**\n     * 默认头像\n     */\n    public static final Integer defaultHeadImage = 9;\n    /**\n     * 个人\n     */\n    @RequestMapping(value = \"/userinfo\")\n    public String userinfo() {\n        return \"userinfo\";\n    }\n\n\n    @RequestMapping(value = \"/getUserinfo\")\n    @ResponseBody\n    public ReturnDto getUserinfo(HttpServletRequest request) {\n        //id应该再session中取，id为user表中id\n        Integer id = (Integer) request.getSession().getAttribute(\"userID\");\n        Userinfo userinfo = userinfoService.getUserinfoByUserId(id);\n        return ReturnDto.buildSuccessReturnDto(userinfo);\n    }\n\n    @RequestMapping(value = \"/saveUserinfo\")\n    @ResponseBody\n    public ReturnDto saveUserinfo(Userinfo userinfo, HttpServletRequest request) {\n        //id应该再session中取，id为user表中id\n        Integer id = (Integer) request.getSession().getAttribute(\"userID\");\n        userinfo.setUserId(id);\n        //头像保存到redis\n        redisService.setValue(\"headImage_\" + id, String.valueOf(userinfo.getHeadImage()));\n        int result = userinfoService.saveUserinfo(userinfo);\n        if (result == 1) {\n            return ReturnDto.buildSuccessReturnDto(\"保存成功\");\n        } else {\n            return ReturnDto.buildFailedReturnDto(\"保存失败，请联系管理员\");\n        }\n    }\n\n    @RequestMapping(value = \"/getSelf\")\n    @ResponseBody\n    public ReturnDto getSelf(HttpServletRequest request) {\n        //用户id从session中取，是user表中的id\n        Integer id = (Integer) request.getSession().getAttribute(\"userID\");\n        Users user = usersService.detailUser(id);\n        return ReturnDto.buildSuccessReturnDto(user);\n    }\n\n    @RequestMapping(value = \"/changePassWord\")\n    public String changePassWord() {\n        return \"changePassWord\";\n    }\n\n    @RequestMapping(value = \"/setNewPassWord\")\n    @ResponseBody\n    public ReturnDto setPassWord(@RequestParam(\"oldpassword\") String oldpassword,\n                                 @RequestParam(\"newpassword\") String newpassword,\n                                 @RequestParam(\"repeatpassword\") String repeatpassword,\n                                 HttpServletRequest request) {\n        //用户id从session中取，是user表中的id\n        Integer id = (Integer) request.getSession().getAttribute(\"userID\");\n        //验证旧密码是否正确环节\n        Users user = usersService.detailUser(id);\n        if (!user.getPassword().equals(MD5Util.string2MD5(oldpassword))) {\n            logger.error(\"旧密码不正确\");\n            return ReturnDto.buildFailedReturnDto(\"旧密码不正确\");\n        }\n        System.out.println(newpassword + \"\\t\" + repeatpassword);\n        //验证新密码是否合法环节 首先防止null或者空字符串蒙混过关 并且再次确认两次输入一致\n        if (newpassword != null && !\"\".equals(newpassword) && newpassword.equals(repeatpassword)) {\n            //验证新密码是否合法\n            if (!newpassword.matches(\".*[a-zA-Z0-9]+.*\") || newpassword.length() > 20 || newpassword.length() < 6) {\n                logger.error(\"新密码不合法\");\n                return ReturnDto.buildFailedReturnDto(\"新密码不合法\");\n            }\n            //更新新密码\n            Users temp = new Users();\n            temp.setPassword(MD5Util.string2MD5(newpassword));\n            int i = usersService.editUser(id, temp);\n            System.out.println(i + \" \" + MD5Util.string2MD5(newpassword));\n            if (i > 0) {\n                //返回修改成功\n                return ReturnDto.buildSuccessReturnDto(\"success\");\n            }\n        }\n        logger.error(\"未知的异常\");\n        //默认返回错误\n        return ReturnDto.buildFailedReturnDto(\"error\");\n    }\n\n    /**\n     * 根据 id 返回头像num\n     */\n    @RequestMapping(value = \"/getHeadImageNumByID\")\n    @ResponseBody\n    public ReturnDto getHeadImageNumByID(HttpServletRequest request) {\n        Integer id = (Integer) request.getSession().getAttribute(\"userID\");\n        String num = redisService.getValue(\"headImage_\" + id);\n        Integer result = defaultHeadImage;//先给个默认值\n        try {\n            result = Integer.parseInt(num);\n        } catch (NumberFormatException e) {\n        }\n        return ReturnDto.buildSuccessReturnDto(result);\n    }\n\n    /**\n     * 根据 id 返回头像num\n     * 这里先获取redis中best的ID，是最佳员工的userID\n     * 再获取这个人的头像\n     * 那么这个人如果没设置过头像 redis的headImage_+他的ID是没有内容的\n     * 这样的情况下给默认值1 就是用默认的头像01.jpg\n     */\n    @RequestMapping(value = \"/getBestImageNum\")\n    @ResponseBody\n    public ReturnDto getBestImageNum() {\n        String num = redisService.getValue(\"headImage_\" + redisService.getValue(\"best\"));\n        Integer result = defaultHeadImage;//先给个默认值\n        try {\n            if(num != null && !\"\".equals(num))\n                result = Integer.parseInt(num);\n        } catch (NumberFormatException e) {\n        }\n        return ReturnDto.buildSuccessReturnDto(result);\n    }\n\n    /**\n     *  获取最佳员工姓名\n     */\n    @RequestMapping(value = \"/getBestUserName\")\n    @ResponseBody\n    public ReturnDto getBestUserName() {\n        String result = \"暂无\";\n        try {\n            String num = redisService.getValue(\"best\");\n            if(num != null && !\"\".equals(num))\n                result = usersService.detailUser(Integer.parseInt(num)).getRealname();\n        } catch (NumberFormatException e) {\n            e.printStackTrace();\n        }\n        return ReturnDto.buildSuccessReturnDto(result);\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/controller/UsersController.java",
    "content": "package com.zmh.projectoa.controller;\n\nimport com.github.pagehelper.PageInfo;\nimport com.zmh.projectoa.dto.ReturnDto;\nimport com.zmh.projectoa.model.Userinfo;\nimport com.zmh.projectoa.model.Users;\nimport com.zmh.projectoa.service.RedisService;\nimport com.zmh.projectoa.service.UserinfoService;\nimport com.zmh.projectoa.service.UsersService;\nimport com.zmh.projectoa.util.ParameterUtil;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.websocket.server.PathParam;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\n\n/**\n * Created by ChengShanyunduo\n * 2018/2/14\n */\n@Controller\n@RequestMapping(\"/user\")\npublic class UsersController {\n\n    @Autowired\n    UsersService usersService;\n\n    @Autowired\n    UserinfoService userinfoService;\n\n    @Autowired\n    RedisService redisService;\n\n    /**\n     * 人员\n     */\n    @RequestMapping(value = \"/user\")\n    public String user(){\n        return \"user\";\n    }\n\n    /**\n     * 创建用户页面\n     * @return\n     */\n    @RequestMapping(value = \"/user_create\")\n    public String createView(){\n        return \"user_create\";\n    }\n\n    /**\n     * 创建职工\n     * @param users\n     * @return\n     */\n    @RequestMapping(value = \"/userCreate\")\n    @ResponseBody\n    public ReturnDto createUser(Users users){\n        if (Objects.isNull(users.getUsername())){\n            return ReturnDto.buildFailedReturnDto(\"请输入用户名\");\n        }\n        if (Objects.isNull(users.getRealname())){\n            return ReturnDto.buildFailedReturnDto(\"请输入员工姓名\");\n        }\n        if (Objects.isNull(users.getDepartmentId())){\n            return ReturnDto.buildFailedReturnDto(\"请选择部门\");\n        }\n        if (Objects.isNull(users.getPositionId())){\n            return ReturnDto.buildFailedReturnDto(\"请选择职位\");\n        }\n\n        Users user = usersService.queryUserByUsername(users);\n        if (!Objects.isNull(user)){\n            return ReturnDto.buildFailedReturnDto(\"用户名已存在\");\n        }\n\n        int count = usersService.createUser(users);\n\n        if (count == 1){\n            return ReturnDto.buildSuccessReturnDto(\"创建成功\");\n        }else {\n            return ReturnDto.buildFailedReturnDto(\"创建失败\");\n        }\n    }\n\n    /**\n     * 用户列表\n     * @param users\n     * @return\n     */\n    @RequestMapping(value = \"/userList\")\n    @ResponseBody\n    public ReturnDto userList(HttpServletRequest request){\n        Map<String, Object> map = ParameterUtil.getParameterMap(request);\n        Integer pageNum = 0;\n        if (map.containsKey(\"pageNum\")){\n            pageNum = Integer.parseInt(map.get(\"pageNum\").toString());\n        }else {\n            pageNum = 1;\n        }\n\n        PageInfo list = usersService.userList(map, pageNum);\n        return ReturnDto.buildSuccessReturnDto(list);\n    }\n\n    /**\n     * 修改用户页面\n     * @param\n     * @return\n     */\n    @RequestMapping(value = \"/edit/{id}\")\n    public String editView(){\n        return \"user_edit\";\n\n    }\n\n    /**\n     * 用户回显\n     * @param id\n     * @return\n     */\n    @RequestMapping(value = \"/detailUser/{id}\")\n    @ResponseBody\n    public ReturnDto detailUser(@PathVariable(name=\"id\") Integer id){\n        Users user = usersService.detailUser(id);\n        return ReturnDto.buildSuccessReturnDto(user);\n    }\n\n    /**\n     * 修改用户\n     * @param id\n     * @param user\n     * @return\n     */\n    @RequestMapping(value = \"/userEdit/{id}\")\n    @ResponseBody\n    public ReturnDto editUser(@PathVariable(name=\"id\") Integer id, Users user){\n        int result = usersService.editUser(id, user);\n        if (result == 1){\n            return ReturnDto.buildSuccessReturnDto(\"修改成功\");\n        }else {\n            return ReturnDto.buildFailedReturnDto(\"修改失败\");\n        }\n    }\n\n    /**\n     * 删除用户\n     * @param id\n     * @return\n     */\n    @RequestMapping(value = \"/userDelete/{id}\")\n    @ResponseBody\n    public ReturnDto userDelete(@PathVariable(name=\"id\") Integer id){\n        int result = usersService.deleteUser(id);\n        if (result == 1){\n            return  ReturnDto.buildSuccessReturnDto(\"删除成功\");\n        }else {\n            return ReturnDto.buildFailedReturnDto(\"删除失败，请联系管理员\");\n        }\n    }\n\n    /**\n     * 重置密码\n     * @param id\n     * @return\n     */\n    @RequestMapping(value = \"/userReverse/{id}\")\n    @ResponseBody\n    public ReturnDto userReverse(@PathVariable(name=\"id\") Integer id){\n        int result = usersService.reverseUser(id);\n        if (result == 1){\n            return  ReturnDto.buildSuccessReturnDto(\"重置成功\");\n        }else {\n            return ReturnDto.buildFailedReturnDto(\"重置失败，请联系管理员\");\n        }\n    }\n\n    @RequestMapping(value = \"/setBest\")\n    @ResponseBody\n    public ReturnDto setBest(@RequestParam(\"id\")Integer id){\n        redisService.setValue(\"best\",String.valueOf(id));\n        return  ReturnDto.buildSuccessReturnDto(\"重置成功\");\n    }\n    @RequestMapping(value = \"/getUser\")\n    @ResponseBody\n    public ReturnDto getUser(@RequestParam(\"userID\")Integer id){\n        Users user = usersService.detailUser(id);\n        return ReturnDto.buildSuccessReturnDto(user);\n    }\n\n    @RequestMapping(value = \"/userinfo/{id}\")\n    public String userinfoPage(){\n        return \"userinfo_detail\";\n    }\n\n    @RequestMapping(value = \"/userinfo/detail/{id}\")\n    @ResponseBody\n    public ReturnDto userinfoDetail(@PathVariable(name=\"id\") Integer id){\n        Userinfo userinfo = userinfoService.getUserinfoByUserId(id);\n        return ReturnDto.buildSuccessReturnDto(userinfo);\n    }\n\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/dto/ReturnDto.java",
    "content": "package com.zmh.projectoa.dto;\n\n/**\n * Created by ChengShanyunduo\n * 2017/12/29\n */\npublic class ReturnDto {\n    private String code;\n    private String message;\n    private Object value;\n    private String status;\n    private String errorMessage;\n\n    public ReturnDto() {\n\n    }\n\n    public ReturnDto(String code, String message, Object value) {\n        this.code = code;\n        this.message = message;\n        this.value = value;\n    }\n\n    public ReturnDto(String status) {\n        this.status = status;\n    }\n\n    public ReturnDto(String status, String errorMessage) {\n        this.status = status;\n        this.errorMessage = errorMessage;\n    }\n\n    public static ReturnDto buildSuccessReturnDto() {\n        return new ReturnDto(\"OK\");\n    }\n\n    public static ReturnDto buildFailReturnDto(String errorMessage) {\n        return new ReturnDto(\"ERROR\", errorMessage);\n    }\n\n    public String getStatus() {\n        return status;\n    }\n\n    public void setStatus(String status) {\n        this.status = status;\n    }\n\n    public String getErrorMessage() {\n        return errorMessage;\n    }\n\n    public void setErrorMessage(String errorMessage) {\n        this.errorMessage = errorMessage;\n    }\n\n    public String getCode() {\n        return code;\n    }\n\n    public void setCode(String code) {\n        this.code = code;\n    }\n\n    public String getMessage() {\n        return message;\n    }\n\n    public void setMessage(String message) {\n        this.message = message;\n    }\n\n    public Object getValue() {\n        return value;\n    }\n\n    public void setValue(Object value) {\n        this.value = value;\n    }\n\n    public static ReturnDto buildSuccessReturnDto(Object value) {\n\n        return new ReturnDto(\"000\", \"Success\", value);\n    }\n\n    public static ReturnDto buildFailedReturnDto(String failMessage) {\n        return new ReturnDto(\"101\", failMessage, null);\n    }\n\n    public static ReturnDto buildSystemErrorReturnDto() {\n        return new ReturnDto(\"599\", \"System Error\", null);\n    }\n\n    @Override\n    public String toString() {\n        return \"ReturnDto{\" +\n                \"code='\" + code + '\\'' +\n                \", message='\" + message + '\\'' +\n                \", value='\" + value + '\\'' +\n                '}';\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/mapper/CalendarMapper.java",
    "content": "package com.zmh.projectoa.mapper;\n\nimport com.zmh.projectoa.model.Calendar;\nimport com.zmh.projectoa.model.CalendarExample;\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\n\n@Mapper\npublic interface CalendarMapper {\n    long countByExample(CalendarExample example);\n\n    int deleteByExample(CalendarExample example);\n\n    int deleteByPrimaryKey(Integer id);\n\n    int insert(Calendar record);\n\n    int insertSelective(Calendar record);\n\n    List<Calendar> selectByExample(CalendarExample example);\n\n    Calendar selectByPrimaryKey(Integer id);\n\n    int updateByExampleSelective(@Param(\"record\") Calendar record, @Param(\"example\") CalendarExample example);\n\n    int updateByExample(@Param(\"record\") Calendar record, @Param(\"example\") CalendarExample example);\n\n    int updateByPrimaryKeySelective(Calendar record);\n\n    int updateByPrimaryKey(Calendar record);\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/mapper/DepartmentsMapper.java",
    "content": "package com.zmh.projectoa.mapper;\n\nimport com.zmh.projectoa.model.Departments;\nimport com.zmh.projectoa.model.DepartmentsExample;\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\n\n@Mapper\npublic interface DepartmentsMapper {\n    long countByExample(DepartmentsExample example);\n\n    int deleteByExample(DepartmentsExample example);\n\n    int deleteByPrimaryKey(Integer id);\n\n    int insert(Departments record);\n\n    int insertSelective(Departments record);\n\n    List<Departments> selectByExample(DepartmentsExample example);\n\n    Departments selectByPrimaryKey(Integer id);\n\n    int updateByExampleSelective(@Param(\"record\") Departments record, @Param(\"example\") DepartmentsExample example);\n\n    int updateByExample(@Param(\"record\") Departments record, @Param(\"example\") DepartmentsExample example);\n\n    int updateByPrimaryKeySelective(Departments record);\n\n    int updateByPrimaryKey(Departments record);\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/mapper/MessagesMapper.java",
    "content": "package com.zmh.projectoa.mapper;\n\nimport com.zmh.projectoa.model.Messages;\nimport com.zmh.projectoa.model.MessagesExample;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\n\n@Mapper\npublic interface MessagesMapper {\n    long countByExample(MessagesExample example);\n\n    int deleteByExample(MessagesExample example);\n\n    int deleteByPrimaryKey(Integer id);\n\n    int insert(Messages record);\n\n    int insertSelective(Messages record);\n\n    List<Messages> selectByExampleWithBLOBs(MessagesExample example);\n\n    List<Messages> selectByExample(MessagesExample example);\n\n    List<Map<String,String>> selectByreceiveID(Integer ID);\n\n    List<Map<String,String>> selectByIDs(List<Integer> IDs);\n\n    List<Map<String,String>> selectLastOneByReceiveID(Integer receiveID);\n\n    Messages selectByPrimaryKey(Integer id);\n\n    int updateByExampleSelective(@Param(\"record\") Messages record, @Param(\"example\") MessagesExample example);\n\n    int updateByExampleWithBLOBs(@Param(\"record\") Messages record, @Param(\"example\") MessagesExample example);\n\n    int updateByExample(@Param(\"record\") Messages record, @Param(\"example\") MessagesExample example);\n\n    int updateByPrimaryKeySelective(Messages record);\n\n    int updateByPrimaryKeyWithBLOBs(Messages record);\n\n    int updateByPrimaryKey(Messages record);\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/mapper/NoticesMapper.java",
    "content": "package com.zmh.projectoa.mapper;\n\nimport com.zmh.projectoa.model.Notices;\nimport com.zmh.projectoa.model.NoticesExample;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\n\n@Mapper\npublic interface NoticesMapper {\n    long countByExample(NoticesExample example);\n\n    int deleteByExample(NoticesExample example);\n\n    int deleteByPrimaryKey(Integer id);\n\n    int insert(Notices record);\n\n    int insertSelective(Notices record);\n\n    List<Notices> selectByExampleWithBLOBs(NoticesExample example);\n\n    List<Notices> selectByExample(NoticesExample example);\n\n    List<Map<String,String>> selectLastOneByReceiveID();\n\n    Notices selectByPrimaryKey(Integer id);\n\n    int updateByExampleSelective(@Param(\"record\") Notices record, @Param(\"example\") NoticesExample example);\n\n    int updateByExampleWithBLOBs(@Param(\"record\") Notices record, @Param(\"example\") NoticesExample example);\n\n    int updateByExample(@Param(\"record\") Notices record, @Param(\"example\") NoticesExample example);\n\n    int updateByPrimaryKeySelective(Notices record);\n\n    int updateByPrimaryKeyWithBLOBs(Notices record);\n\n    int updateByPrimaryKey(Notices record);\n\n    List<Map<String,String>> selectAllNotice();\n\n    List<Map<String,String>> selectByIDs(List<Integer> IDs);\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/mapper/PositionsMapper.java",
    "content": "package com.zmh.projectoa.mapper;\n\nimport com.zmh.projectoa.model.Positions;\nimport com.zmh.projectoa.model.PositionsExample;\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\n\n@Mapper\npublic interface PositionsMapper {\n    long countByExample(PositionsExample example);\n\n    int deleteByExample(PositionsExample example);\n\n    int deleteByPrimaryKey(Integer id);\n\n    int insert(Positions record);\n\n    int insertSelective(Positions record);\n\n    List<Positions> selectByExample(PositionsExample example);\n\n    Positions selectByPrimaryKey(Integer id);\n\n    int updateByExampleSelective(@Param(\"record\") Positions record, @Param(\"example\") PositionsExample example);\n\n    int updateByExample(@Param(\"record\") Positions record, @Param(\"example\") PositionsExample example);\n\n    int updateByPrimaryKeySelective(Positions record);\n\n    int updateByPrimaryKey(Positions record);\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/mapper/UserinfoMapper.java",
    "content": "package com.zmh.projectoa.mapper;\n\nimport com.zmh.projectoa.model.Userinfo;\nimport com.zmh.projectoa.model.UserinfoExample;\nimport java.util.List;\n\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\n\n@Mapper\npublic interface UserinfoMapper {\n    long countByExample(UserinfoExample example);\n\n    int deleteByExample(UserinfoExample example);\n\n    int deleteByPrimaryKey(Integer id);\n\n    int insert(Userinfo record);\n\n    int insertSelective(Userinfo record);\n\n    List<Userinfo> selectByExample(UserinfoExample example);\n\n    Userinfo selectByPrimaryKey(Integer id);\n\n    int updateByExampleSelective(@Param(\"record\") Userinfo record, @Param(\"example\") UserinfoExample example);\n\n    int updateByExample(@Param(\"record\") Userinfo record, @Param(\"example\") UserinfoExample example);\n\n    int updateByPrimaryKeySelective(Userinfo record);\n\n    int updateByPrimaryKey(Userinfo record);\n\n    Userinfo queryUserinfoByUserid(Integer userId);\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/mapper/UsersMapper.java",
    "content": "package com.zmh.projectoa.mapper;\n\nimport com.zmh.projectoa.model.Users;\nimport com.zmh.projectoa.model.UsersExample;\nimport java.util.List;\nimport java.util.Map;\n\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\n\n@Mapper\npublic interface UsersMapper {\n    long countByExample(UsersExample example);\n\n    int deleteByExample(UsersExample example);\n\n    int deleteByPrimaryKey(Integer id);\n\n    int insert(Users record);\n\n    int insertSelective(Users record);\n\n    List<Users> selectByExample(UsersExample example);\n\n    Users selectByPrimaryKey(Integer id);\n\n    int updateByExampleSelective(@Param(\"record\") Users record, @Param(\"example\") UsersExample example);\n\n    int updateByExample(@Param(\"record\") Users record, @Param(\"example\") UsersExample example);\n\n    int updateByPrimaryKeySelective(Users record);\n\n    int updateByPrimaryKey(Users record);\n\n    Users queryUserByUsername (@Param(\"username\") String username);\n\n    List<Users> queryBySelective(Map<String, Object> map);\n\n    List<Map<String,String>> queryAll(Integer id);\n\n    List<Users> queryAllUsers();\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/model/Calendar.java",
    "content": "package com.zmh.projectoa.model;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @author \n */\npublic class Calendar implements Serializable {\n    private Integer id;\n\n    private Integer userId;\n\n    private String title;\n\n    private Date startTime;\n\n    private Date endTime;\n\n    private Date createTime;\n\n    private Date updateTime;\n\n    private static final long serialVersionUID = 1L;\n\n    public Integer getId() {\n        return id;\n    }\n\n    public void setId(Integer id) {\n        this.id = id;\n    }\n\n    public Integer getUserId() {\n        return userId;\n    }\n\n    public void setUserId(Integer userId) {\n        this.userId = userId;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public void setTitle(String title) {\n        this.title = title;\n    }\n\n    public Date getStartTime() {\n        return startTime;\n    }\n\n    public void setStartTime(Date startTime) {\n        this.startTime = startTime;\n    }\n\n    public Date getEndTime() {\n        return endTime;\n    }\n\n    public void setEndTime(Date endTime) {\n        this.endTime = endTime;\n    }\n\n    public Date getCreateTime() {\n        return createTime;\n    }\n\n    public void setCreateTime(Date createTime) {\n        this.createTime = createTime;\n    }\n\n    public Date getUpdateTime() {\n        return updateTime;\n    }\n\n    public void setUpdateTime(Date updateTime) {\n        this.updateTime = updateTime;\n    }\n\n    @Override\n    public boolean equals(Object that) {\n        if (this == that) {\n            return true;\n        }\n        if (that == null) {\n            return false;\n        }\n        if (getClass() != that.getClass()) {\n            return false;\n        }\n        Calendar other = (Calendar) that;\n        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))\n            && (this.getUserId() == null ? other.getUserId() == null : this.getUserId().equals(other.getUserId()))\n            && (this.getTitle() == null ? other.getTitle() == null : this.getTitle().equals(other.getTitle()))\n            && (this.getStartTime() == null ? other.getStartTime() == null : this.getStartTime().equals(other.getStartTime()))\n            && (this.getEndTime() == null ? other.getEndTime() == null : this.getEndTime().equals(other.getEndTime()))\n            && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()))\n            && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime()));\n    }\n\n    @Override\n    public int hashCode() {\n        final int prime = 31;\n        int result = 1;\n        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());\n        result = prime * result + ((getUserId() == null) ? 0 : getUserId().hashCode());\n        result = prime * result + ((getTitle() == null) ? 0 : getTitle().hashCode());\n        result = prime * result + ((getStartTime() == null) ? 0 : getStartTime().hashCode());\n        result = prime * result + ((getEndTime() == null) ? 0 : getEndTime().hashCode());\n        result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());\n        result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode());\n        return result;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", id=\").append(id);\n        sb.append(\", userId=\").append(userId);\n        sb.append(\", title=\").append(title);\n        sb.append(\", startTime=\").append(startTime);\n        sb.append(\", endTime=\").append(endTime);\n        sb.append(\", createTime=\").append(createTime);\n        sb.append(\", updateTime=\").append(updateTime);\n        sb.append(\", serialVersionUID=\").append(serialVersionUID);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/model/CalendarExample.java",
    "content": "package com.zmh.projectoa.model;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\n\npublic class CalendarExample {\n    protected String orderByClause;\n\n    protected boolean distinct;\n\n    protected List<Criteria> oredCriteria;\n\n    private Integer limit;\n\n    private Integer offset;\n\n    public CalendarExample() {\n        oredCriteria = new ArrayList<Criteria>();\n    }\n\n    public void setOrderByClause(String orderByClause) {\n        this.orderByClause = orderByClause;\n    }\n\n    public String getOrderByClause() {\n        return orderByClause;\n    }\n\n    public void setDistinct(boolean distinct) {\n        this.distinct = distinct;\n    }\n\n    public boolean isDistinct() {\n        return distinct;\n    }\n\n    public List<Criteria> getOredCriteria() {\n        return oredCriteria;\n    }\n\n    public void or(Criteria criteria) {\n        oredCriteria.add(criteria);\n    }\n\n    public Criteria or() {\n        Criteria criteria = createCriteriaInternal();\n        oredCriteria.add(criteria);\n        return criteria;\n    }\n\n    public Criteria createCriteria() {\n        Criteria criteria = createCriteriaInternal();\n        if (oredCriteria.size() == 0) {\n            oredCriteria.add(criteria);\n        }\n        return criteria;\n    }\n\n    protected Criteria createCriteriaInternal() {\n        Criteria criteria = new Criteria();\n        return criteria;\n    }\n\n    public void clear() {\n        oredCriteria.clear();\n        orderByClause = null;\n        distinct = false;\n    }\n\n    public void setLimit(Integer limit) {\n        this.limit = limit;\n    }\n\n    public Integer getLimit() {\n        return limit;\n    }\n\n    public void setOffset(Integer offset) {\n        this.offset = offset;\n    }\n\n    public Integer getOffset() {\n        return offset;\n    }\n\n    protected abstract static class GeneratedCriteria {\n        protected List<Criterion> criteria;\n\n        protected GeneratedCriteria() {\n            super();\n            criteria = new ArrayList<Criterion>();\n        }\n\n        public boolean isValid() {\n            return criteria.size() > 0;\n        }\n\n        public List<Criterion> getAllCriteria() {\n            return criteria;\n        }\n\n        public List<Criterion> getCriteria() {\n            return criteria;\n        }\n\n        protected void addCriterion(String condition) {\n            if (condition == null) {\n                throw new RuntimeException(\"Value for condition cannot be null\");\n            }\n            criteria.add(new Criterion(condition));\n        }\n\n        protected void addCriterion(String condition, Object value, String property) {\n            if (value == null) {\n                throw new RuntimeException(\"Value for \" + property + \" cannot be null\");\n            }\n            criteria.add(new Criterion(condition, value));\n        }\n\n        protected void addCriterion(String condition, Object value1, Object value2, String property) {\n            if (value1 == null || value2 == null) {\n                throw new RuntimeException(\"Between values for \" + property + \" cannot be null\");\n            }\n            criteria.add(new Criterion(condition, value1, value2));\n        }\n\n        public Criteria andIdIsNull() {\n            addCriterion(\"id is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdIsNotNull() {\n            addCriterion(\"id is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdEqualTo(Integer value) {\n            addCriterion(\"id =\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotEqualTo(Integer value) {\n            addCriterion(\"id <>\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdGreaterThan(Integer value) {\n            addCriterion(\"id >\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdGreaterThanOrEqualTo(Integer value) {\n            addCriterion(\"id >=\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdLessThan(Integer value) {\n            addCriterion(\"id <\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdLessThanOrEqualTo(Integer value) {\n            addCriterion(\"id <=\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdIn(List<Integer> values) {\n            addCriterion(\"id in\", values, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotIn(List<Integer> values) {\n            addCriterion(\"id not in\", values, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdBetween(Integer value1, Integer value2) {\n            addCriterion(\"id between\", value1, value2, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotBetween(Integer value1, Integer value2) {\n            addCriterion(\"id not between\", value1, value2, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdIsNull() {\n            addCriterion(\"user_id is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdIsNotNull() {\n            addCriterion(\"user_id is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdEqualTo(Integer value) {\n            addCriterion(\"user_id =\", value, \"userId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdNotEqualTo(Integer value) {\n            addCriterion(\"user_id <>\", value, \"userId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdGreaterThan(Integer value) {\n            addCriterion(\"user_id >\", value, \"userId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdGreaterThanOrEqualTo(Integer value) {\n            addCriterion(\"user_id >=\", value, \"userId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdLessThan(Integer value) {\n            addCriterion(\"user_id <\", value, \"userId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdLessThanOrEqualTo(Integer value) {\n            addCriterion(\"user_id <=\", value, \"userId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdIn(List<Integer> values) {\n            addCriterion(\"user_id in\", values, \"userId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdNotIn(List<Integer> values) {\n            addCriterion(\"user_id not in\", values, \"userId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdBetween(Integer value1, Integer value2) {\n            addCriterion(\"user_id between\", value1, value2, \"userId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdNotBetween(Integer value1, Integer value2) {\n            addCriterion(\"user_id not between\", value1, value2, \"userId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleIsNull() {\n            addCriterion(\"title is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleIsNotNull() {\n            addCriterion(\"title is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleEqualTo(String value) {\n            addCriterion(\"title =\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleNotEqualTo(String value) {\n            addCriterion(\"title <>\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleGreaterThan(String value) {\n            addCriterion(\"title >\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleGreaterThanOrEqualTo(String value) {\n            addCriterion(\"title >=\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleLessThan(String value) {\n            addCriterion(\"title <\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleLessThanOrEqualTo(String value) {\n            addCriterion(\"title <=\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleLike(String value) {\n            addCriterion(\"title like\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleNotLike(String value) {\n            addCriterion(\"title not like\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleIn(List<String> values) {\n            addCriterion(\"title in\", values, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleNotIn(List<String> values) {\n            addCriterion(\"title not in\", values, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleBetween(String value1, String value2) {\n            addCriterion(\"title between\", value1, value2, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleNotBetween(String value1, String value2) {\n            addCriterion(\"title not between\", value1, value2, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andStartTimeIsNull() {\n            addCriterion(\"start_time is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andStartTimeIsNotNull() {\n            addCriterion(\"start_time is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andStartTimeEqualTo(Date value) {\n            addCriterion(\"start_time =\", value, \"startTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andStartTimeNotEqualTo(Date value) {\n            addCriterion(\"start_time <>\", value, \"startTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andStartTimeGreaterThan(Date value) {\n            addCriterion(\"start_time >\", value, \"startTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andStartTimeGreaterThanOrEqualTo(Date value) {\n            addCriterion(\"start_time >=\", value, \"startTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andStartTimeLessThan(Date value) {\n            addCriterion(\"start_time <\", value, \"startTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andStartTimeLessThanOrEqualTo(Date value) {\n            addCriterion(\"start_time <=\", value, \"startTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andStartTimeIn(List<Date> values) {\n            addCriterion(\"start_time in\", values, \"startTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andStartTimeNotIn(List<Date> values) {\n            addCriterion(\"start_time not in\", values, \"startTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andStartTimeBetween(Date value1, Date value2) {\n            addCriterion(\"start_time between\", value1, value2, \"startTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andStartTimeNotBetween(Date value1, Date value2) {\n            addCriterion(\"start_time not between\", value1, value2, \"startTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEndTimeIsNull() {\n            addCriterion(\"end_time is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEndTimeIsNotNull() {\n            addCriterion(\"end_time is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEndTimeEqualTo(Date value) {\n            addCriterion(\"end_time =\", value, \"endTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEndTimeNotEqualTo(Date value) {\n            addCriterion(\"end_time <>\", value, \"endTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEndTimeGreaterThan(Date value) {\n            addCriterion(\"end_time >\", value, \"endTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEndTimeGreaterThanOrEqualTo(Date value) {\n            addCriterion(\"end_time >=\", value, \"endTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEndTimeLessThan(Date value) {\n            addCriterion(\"end_time <\", value, \"endTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEndTimeLessThanOrEqualTo(Date value) {\n            addCriterion(\"end_time <=\", value, \"endTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEndTimeIn(List<Date> values) {\n            addCriterion(\"end_time in\", values, \"endTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEndTimeNotIn(List<Date> values) {\n            addCriterion(\"end_time not in\", values, \"endTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEndTimeBetween(Date value1, Date value2) {\n            addCriterion(\"end_time between\", value1, value2, \"endTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEndTimeNotBetween(Date value1, Date value2) {\n            addCriterion(\"end_time not between\", value1, value2, \"endTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIsNull() {\n            addCriterion(\"create_time is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIsNotNull() {\n            addCriterion(\"create_time is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeEqualTo(Date value) {\n            addCriterion(\"create_time =\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotEqualTo(Date value) {\n            addCriterion(\"create_time <>\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeGreaterThan(Date value) {\n            addCriterion(\"create_time >\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {\n            addCriterion(\"create_time >=\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeLessThan(Date value) {\n            addCriterion(\"create_time <\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {\n            addCriterion(\"create_time <=\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIn(List<Date> values) {\n            addCriterion(\"create_time in\", values, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotIn(List<Date> values) {\n            addCriterion(\"create_time not in\", values, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeBetween(Date value1, Date value2) {\n            addCriterion(\"create_time between\", value1, value2, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {\n            addCriterion(\"create_time not between\", value1, value2, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIsNull() {\n            addCriterion(\"update_time is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIsNotNull() {\n            addCriterion(\"update_time is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeEqualTo(Date value) {\n            addCriterion(\"update_time =\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotEqualTo(Date value) {\n            addCriterion(\"update_time <>\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeGreaterThan(Date value) {\n            addCriterion(\"update_time >\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) {\n            addCriterion(\"update_time >=\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeLessThan(Date value) {\n            addCriterion(\"update_time <\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeLessThanOrEqualTo(Date value) {\n            addCriterion(\"update_time <=\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIn(List<Date> values) {\n            addCriterion(\"update_time in\", values, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotIn(List<Date> values) {\n            addCriterion(\"update_time not in\", values, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeBetween(Date value1, Date value2) {\n            addCriterion(\"update_time between\", value1, value2, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotBetween(Date value1, Date value2) {\n            addCriterion(\"update_time not between\", value1, value2, \"updateTime\");\n            return (Criteria) this;\n        }\n    }\n\n    /**\n     */\n    public static class Criteria extends GeneratedCriteria {\n\n        protected Criteria() {\n            super();\n        }\n    }\n\n    public static class Criterion {\n        private String condition;\n\n        private Object value;\n\n        private Object secondValue;\n\n        private boolean noValue;\n\n        private boolean singleValue;\n\n        private boolean betweenValue;\n\n        private boolean listValue;\n\n        private String typeHandler;\n\n        public String getCondition() {\n            return condition;\n        }\n\n        public Object getValue() {\n            return value;\n        }\n\n        public Object getSecondValue() {\n            return secondValue;\n        }\n\n        public boolean isNoValue() {\n            return noValue;\n        }\n\n        public boolean isSingleValue() {\n            return singleValue;\n        }\n\n        public boolean isBetweenValue() {\n            return betweenValue;\n        }\n\n        public boolean isListValue() {\n            return listValue;\n        }\n\n        public String getTypeHandler() {\n            return typeHandler;\n        }\n\n        protected Criterion(String condition) {\n            super();\n            this.condition = condition;\n            this.typeHandler = null;\n            this.noValue = true;\n        }\n\n        protected Criterion(String condition, Object value, String typeHandler) {\n            super();\n            this.condition = condition;\n            this.value = value;\n            this.typeHandler = typeHandler;\n            if (value instanceof List<?>) {\n                this.listValue = true;\n            } else {\n                this.singleValue = true;\n            }\n        }\n\n        protected Criterion(String condition, Object value) {\n            this(condition, value, null);\n        }\n\n        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {\n            super();\n            this.condition = condition;\n            this.value = value;\n            this.secondValue = secondValue;\n            this.typeHandler = typeHandler;\n            this.betweenValue = true;\n        }\n\n        protected Criterion(String condition, Object value, Object secondValue) {\n            this(condition, value, secondValue, null);\n        }\n    }\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/model/Departments.java",
    "content": "package com.zmh.projectoa.model;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @author \n */\npublic class Departments implements Serializable {\n    private Integer id;\n\n    private String department;\n\n    private Date createTime;\n\n    private Date updateTime;\n\n    private static final long serialVersionUID = 1L;\n\n    public Integer getId() {\n        return id;\n    }\n\n    public void setId(Integer id) {\n        this.id = id;\n    }\n\n    public String getDepartment() {\n        return department;\n    }\n\n    public void setDepartment(String department) {\n        this.department = department;\n    }\n\n    public Date getCreateTime() {\n        return createTime;\n    }\n\n    public void setCreateTime(Date createTime) {\n        this.createTime = createTime;\n    }\n\n    public Date getUpdateTime() {\n        return updateTime;\n    }\n\n    public void setUpdateTime(Date updateTime) {\n        this.updateTime = updateTime;\n    }\n\n    @Override\n    public boolean equals(Object that) {\n        if (this == that) {\n            return true;\n        }\n        if (that == null) {\n            return false;\n        }\n        if (getClass() != that.getClass()) {\n            return false;\n        }\n        Departments other = (Departments) that;\n        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))\n            && (this.getDepartment() == null ? other.getDepartment() == null : this.getDepartment().equals(other.getDepartment()))\n            && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()))\n            && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime()));\n    }\n\n    @Override\n    public int hashCode() {\n        final int prime = 31;\n        int result = 1;\n        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());\n        result = prime * result + ((getDepartment() == null) ? 0 : getDepartment().hashCode());\n        result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());\n        result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode());\n        return result;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", id=\").append(id);\n        sb.append(\", department=\").append(department);\n        sb.append(\", createTime=\").append(createTime);\n        sb.append(\", updateTime=\").append(updateTime);\n        sb.append(\", serialVersionUID=\").append(serialVersionUID);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/model/DepartmentsExample.java",
    "content": "package com.zmh.projectoa.model;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\n\npublic class DepartmentsExample {\n    protected String orderByClause;\n\n    protected boolean distinct;\n\n    protected List<Criteria> oredCriteria;\n\n    private Integer limit;\n\n    private Integer offset;\n\n    public DepartmentsExample() {\n        oredCriteria = new ArrayList<Criteria>();\n    }\n\n    public void setOrderByClause(String orderByClause) {\n        this.orderByClause = orderByClause;\n    }\n\n    public String getOrderByClause() {\n        return orderByClause;\n    }\n\n    public void setDistinct(boolean distinct) {\n        this.distinct = distinct;\n    }\n\n    public boolean isDistinct() {\n        return distinct;\n    }\n\n    public List<Criteria> getOredCriteria() {\n        return oredCriteria;\n    }\n\n    public void or(Criteria criteria) {\n        oredCriteria.add(criteria);\n    }\n\n    public Criteria or() {\n        Criteria criteria = createCriteriaInternal();\n        oredCriteria.add(criteria);\n        return criteria;\n    }\n\n    public Criteria createCriteria() {\n        Criteria criteria = createCriteriaInternal();\n        if (oredCriteria.size() == 0) {\n            oredCriteria.add(criteria);\n        }\n        return criteria;\n    }\n\n    protected Criteria createCriteriaInternal() {\n        Criteria criteria = new Criteria();\n        return criteria;\n    }\n\n    public void clear() {\n        oredCriteria.clear();\n        orderByClause = null;\n        distinct = false;\n    }\n\n    public void setLimit(Integer limit) {\n        this.limit = limit;\n    }\n\n    public Integer getLimit() {\n        return limit;\n    }\n\n    public void setOffset(Integer offset) {\n        this.offset = offset;\n    }\n\n    public Integer getOffset() {\n        return offset;\n    }\n\n    protected abstract static class GeneratedCriteria {\n        protected List<Criterion> criteria;\n\n        protected GeneratedCriteria() {\n            super();\n            criteria = new ArrayList<Criterion>();\n        }\n\n        public boolean isValid() {\n            return criteria.size() > 0;\n        }\n\n        public List<Criterion> getAllCriteria() {\n            return criteria;\n        }\n\n        public List<Criterion> getCriteria() {\n            return criteria;\n        }\n\n        protected void addCriterion(String condition) {\n            if (condition == null) {\n                throw new RuntimeException(\"Value for condition cannot be null\");\n            }\n            criteria.add(new Criterion(condition));\n        }\n\n        protected void addCriterion(String condition, Object value, String property) {\n            if (value == null) {\n                throw new RuntimeException(\"Value for \" + property + \" cannot be null\");\n            }\n            criteria.add(new Criterion(condition, value));\n        }\n\n        protected void addCriterion(String condition, Object value1, Object value2, String property) {\n            if (value1 == null || value2 == null) {\n                throw new RuntimeException(\"Between values for \" + property + \" cannot be null\");\n            }\n            criteria.add(new Criterion(condition, value1, value2));\n        }\n\n        public Criteria andIdIsNull() {\n            addCriterion(\"id is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdIsNotNull() {\n            addCriterion(\"id is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdEqualTo(Integer value) {\n            addCriterion(\"id =\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotEqualTo(Integer value) {\n            addCriterion(\"id <>\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdGreaterThan(Integer value) {\n            addCriterion(\"id >\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdGreaterThanOrEqualTo(Integer value) {\n            addCriterion(\"id >=\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdLessThan(Integer value) {\n            addCriterion(\"id <\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdLessThanOrEqualTo(Integer value) {\n            addCriterion(\"id <=\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdIn(List<Integer> values) {\n            addCriterion(\"id in\", values, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotIn(List<Integer> values) {\n            addCriterion(\"id not in\", values, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdBetween(Integer value1, Integer value2) {\n            addCriterion(\"id between\", value1, value2, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotBetween(Integer value1, Integer value2) {\n            addCriterion(\"id not between\", value1, value2, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentIsNull() {\n            addCriterion(\"department is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentIsNotNull() {\n            addCriterion(\"department is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentEqualTo(String value) {\n            addCriterion(\"department =\", value, \"department\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentNotEqualTo(String value) {\n            addCriterion(\"department <>\", value, \"department\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentGreaterThan(String value) {\n            addCriterion(\"department >\", value, \"department\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentGreaterThanOrEqualTo(String value) {\n            addCriterion(\"department >=\", value, \"department\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentLessThan(String value) {\n            addCriterion(\"department <\", value, \"department\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentLessThanOrEqualTo(String value) {\n            addCriterion(\"department <=\", value, \"department\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentLike(String value) {\n            addCriterion(\"department like\", value, \"department\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentNotLike(String value) {\n            addCriterion(\"department not like\", value, \"department\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentIn(List<String> values) {\n            addCriterion(\"department in\", values, \"department\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentNotIn(List<String> values) {\n            addCriterion(\"department not in\", values, \"department\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentBetween(String value1, String value2) {\n            addCriterion(\"department between\", value1, value2, \"department\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentNotBetween(String value1, String value2) {\n            addCriterion(\"department not between\", value1, value2, \"department\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIsNull() {\n            addCriterion(\"create_time is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIsNotNull() {\n            addCriterion(\"create_time is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeEqualTo(Date value) {\n            addCriterion(\"create_time =\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotEqualTo(Date value) {\n            addCriterion(\"create_time <>\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeGreaterThan(Date value) {\n            addCriterion(\"create_time >\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {\n            addCriterion(\"create_time >=\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeLessThan(Date value) {\n            addCriterion(\"create_time <\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {\n            addCriterion(\"create_time <=\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIn(List<Date> values) {\n            addCriterion(\"create_time in\", values, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotIn(List<Date> values) {\n            addCriterion(\"create_time not in\", values, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeBetween(Date value1, Date value2) {\n            addCriterion(\"create_time between\", value1, value2, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {\n            addCriterion(\"create_time not between\", value1, value2, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIsNull() {\n            addCriterion(\"update_time is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIsNotNull() {\n            addCriterion(\"update_time is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeEqualTo(Date value) {\n            addCriterion(\"update_time =\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotEqualTo(Date value) {\n            addCriterion(\"update_time <>\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeGreaterThan(Date value) {\n            addCriterion(\"update_time >\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) {\n            addCriterion(\"update_time >=\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeLessThan(Date value) {\n            addCriterion(\"update_time <\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeLessThanOrEqualTo(Date value) {\n            addCriterion(\"update_time <=\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIn(List<Date> values) {\n            addCriterion(\"update_time in\", values, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotIn(List<Date> values) {\n            addCriterion(\"update_time not in\", values, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeBetween(Date value1, Date value2) {\n            addCriterion(\"update_time between\", value1, value2, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotBetween(Date value1, Date value2) {\n            addCriterion(\"update_time not between\", value1, value2, \"updateTime\");\n            return (Criteria) this;\n        }\n    }\n\n    /**\n     */\n    public static class Criteria extends GeneratedCriteria {\n\n        protected Criteria() {\n            super();\n        }\n    }\n\n    public static class Criterion {\n        private String condition;\n\n        private Object value;\n\n        private Object secondValue;\n\n        private boolean noValue;\n\n        private boolean singleValue;\n\n        private boolean betweenValue;\n\n        private boolean listValue;\n\n        private String typeHandler;\n\n        public String getCondition() {\n            return condition;\n        }\n\n        public Object getValue() {\n            return value;\n        }\n\n        public Object getSecondValue() {\n            return secondValue;\n        }\n\n        public boolean isNoValue() {\n            return noValue;\n        }\n\n        public boolean isSingleValue() {\n            return singleValue;\n        }\n\n        public boolean isBetweenValue() {\n            return betweenValue;\n        }\n\n        public boolean isListValue() {\n            return listValue;\n        }\n\n        public String getTypeHandler() {\n            return typeHandler;\n        }\n\n        protected Criterion(String condition) {\n            super();\n            this.condition = condition;\n            this.typeHandler = null;\n            this.noValue = true;\n        }\n\n        protected Criterion(String condition, Object value, String typeHandler) {\n            super();\n            this.condition = condition;\n            this.value = value;\n            this.typeHandler = typeHandler;\n            if (value instanceof List<?>) {\n                this.listValue = true;\n            } else {\n                this.singleValue = true;\n            }\n        }\n\n        protected Criterion(String condition, Object value) {\n            this(condition, value, null);\n        }\n\n        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {\n            super();\n            this.condition = condition;\n            this.value = value;\n            this.secondValue = secondValue;\n            this.typeHandler = typeHandler;\n            this.betweenValue = true;\n        }\n\n        protected Criterion(String condition, Object value, Object secondValue) {\n            this(condition, value, secondValue, null);\n        }\n    }\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/model/Messages.java",
    "content": "package com.zmh.projectoa.model;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @author \n */\npublic class Messages implements Serializable {\n    private Integer id;\n\n    private String title;\n\n    private Integer sendId;\n\n    private Integer receiveId;\n\n    private String isDel;\n\n    private Date createTime;\n\n    private Date updateTime;\n\n    private String message;\n\n    private static final long serialVersionUID = 1L;\n\n    public Integer getId() {\n        return id;\n    }\n\n    public void setId(Integer id) {\n        this.id = id;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public void setTitle(String title) {\n        this.title = title;\n    }\n\n    public Integer getSendId() {\n        return sendId;\n    }\n\n    public void setSendId(Integer sendId) {\n        this.sendId = sendId;\n    }\n\n    public Integer getReceiveId() {\n        return receiveId;\n    }\n\n    public void setReceiveId(Integer receiveId) {\n        this.receiveId = receiveId;\n    }\n\n    public String getIsDel() {\n        return isDel;\n    }\n\n    public void setIsDel(String isDel) {\n        this.isDel = isDel;\n    }\n\n    public Date getCreateTime() {\n        return createTime;\n    }\n\n    public void setCreateTime(Date createTime) {\n        this.createTime = createTime;\n    }\n\n    public Date getUpdateTime() {\n        return updateTime;\n    }\n\n    public void setUpdateTime(Date updateTime) {\n        this.updateTime = updateTime;\n    }\n\n    public String getMessage() {\n        return message;\n    }\n\n    public void setMessage(String message) {\n        this.message = message;\n    }\n\n    @Override\n    public boolean equals(Object that) {\n        if (this == that) {\n            return true;\n        }\n        if (that == null) {\n            return false;\n        }\n        if (getClass() != that.getClass()) {\n            return false;\n        }\n        Messages other = (Messages) that;\n        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))\n            && (this.getTitle() == null ? other.getTitle() == null : this.getTitle().equals(other.getTitle()))\n            && (this.getSendId() == null ? other.getSendId() == null : this.getSendId().equals(other.getSendId()))\n            && (this.getReceiveId() == null ? other.getReceiveId() == null : this.getReceiveId().equals(other.getReceiveId()))\n            && (this.getIsDel() == null ? other.getIsDel() == null : this.getIsDel().equals(other.getIsDel()))\n            && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()))\n            && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime()))\n            && (this.getMessage() == null ? other.getMessage() == null : this.getMessage().equals(other.getMessage()));\n    }\n\n    @Override\n    public int hashCode() {\n        final int prime = 31;\n        int result = 1;\n        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());\n        result = prime * result + ((getTitle() == null) ? 0 : getTitle().hashCode());\n        result = prime * result + ((getSendId() == null) ? 0 : getSendId().hashCode());\n        result = prime * result + ((getReceiveId() == null) ? 0 : getReceiveId().hashCode());\n        result = prime * result + ((getIsDel() == null) ? 0 : getIsDel().hashCode());\n        result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());\n        result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode());\n        result = prime * result + ((getMessage() == null) ? 0 : getMessage().hashCode());\n        return result;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", id=\").append(id);\n        sb.append(\", title=\").append(title);\n        sb.append(\", sendId=\").append(sendId);\n        sb.append(\", receiveId=\").append(receiveId);\n        sb.append(\", isDel=\").append(isDel);\n        sb.append(\", createTime=\").append(createTime);\n        sb.append(\", updateTime=\").append(updateTime);\n        sb.append(\", message=\").append(message);\n        sb.append(\", serialVersionUID=\").append(serialVersionUID);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/model/MessagesExample.java",
    "content": "package com.zmh.projectoa.model;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\n\npublic class MessagesExample {\n    protected String orderByClause;\n\n    protected boolean distinct;\n\n    protected List<Criteria> oredCriteria;\n\n    private Integer limit;\n\n    private Integer offset;\n\n    public MessagesExample() {\n        oredCriteria = new ArrayList<Criteria>();\n    }\n\n    public void setOrderByClause(String orderByClause) {\n        this.orderByClause = orderByClause;\n    }\n\n    public String getOrderByClause() {\n        return orderByClause;\n    }\n\n    public void setDistinct(boolean distinct) {\n        this.distinct = distinct;\n    }\n\n    public boolean isDistinct() {\n        return distinct;\n    }\n\n    public List<Criteria> getOredCriteria() {\n        return oredCriteria;\n    }\n\n    public void or(Criteria criteria) {\n        oredCriteria.add(criteria);\n    }\n\n    public Criteria or() {\n        Criteria criteria = createCriteriaInternal();\n        oredCriteria.add(criteria);\n        return criteria;\n    }\n\n    public Criteria createCriteria() {\n        Criteria criteria = createCriteriaInternal();\n        if (oredCriteria.size() == 0) {\n            oredCriteria.add(criteria);\n        }\n        return criteria;\n    }\n\n    protected Criteria createCriteriaInternal() {\n        Criteria criteria = new Criteria();\n        return criteria;\n    }\n\n    public void clear() {\n        oredCriteria.clear();\n        orderByClause = null;\n        distinct = false;\n    }\n\n    public void setLimit(Integer limit) {\n        this.limit = limit;\n    }\n\n    public Integer getLimit() {\n        return limit;\n    }\n\n    public void setOffset(Integer offset) {\n        this.offset = offset;\n    }\n\n    public Integer getOffset() {\n        return offset;\n    }\n\n    protected abstract static class GeneratedCriteria {\n        protected List<Criterion> criteria;\n\n        protected GeneratedCriteria() {\n            super();\n            criteria = new ArrayList<Criterion>();\n        }\n\n        public boolean isValid() {\n            return criteria.size() > 0;\n        }\n\n        public List<Criterion> getAllCriteria() {\n            return criteria;\n        }\n\n        public List<Criterion> getCriteria() {\n            return criteria;\n        }\n\n        protected void addCriterion(String condition) {\n            if (condition == null) {\n                throw new RuntimeException(\"Value for condition cannot be null\");\n            }\n            criteria.add(new Criterion(condition));\n        }\n\n        protected void addCriterion(String condition, Object value, String property) {\n            if (value == null) {\n                throw new RuntimeException(\"Value for \" + property + \" cannot be null\");\n            }\n            criteria.add(new Criterion(condition, value));\n        }\n\n        protected void addCriterion(String condition, Object value1, Object value2, String property) {\n            if (value1 == null || value2 == null) {\n                throw new RuntimeException(\"Between values for \" + property + \" cannot be null\");\n            }\n            criteria.add(new Criterion(condition, value1, value2));\n        }\n\n        public Criteria andIdIsNull() {\n            addCriterion(\"id is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdIsNotNull() {\n            addCriterion(\"id is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdEqualTo(Integer value) {\n            addCriterion(\"id =\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotEqualTo(Integer value) {\n            addCriterion(\"id <>\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdGreaterThan(Integer value) {\n            addCriterion(\"id >\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdGreaterThanOrEqualTo(Integer value) {\n            addCriterion(\"id >=\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdLessThan(Integer value) {\n            addCriterion(\"id <\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdLessThanOrEqualTo(Integer value) {\n            addCriterion(\"id <=\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdIn(List<Integer> values) {\n            addCriterion(\"id in\", values, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotIn(List<Integer> values) {\n            addCriterion(\"id not in\", values, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdBetween(Integer value1, Integer value2) {\n            addCriterion(\"id between\", value1, value2, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotBetween(Integer value1, Integer value2) {\n            addCriterion(\"id not between\", value1, value2, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleIsNull() {\n            addCriterion(\"title is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleIsNotNull() {\n            addCriterion(\"title is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleEqualTo(String value) {\n            addCriterion(\"title =\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleNotEqualTo(String value) {\n            addCriterion(\"title <>\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleGreaterThan(String value) {\n            addCriterion(\"title >\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleGreaterThanOrEqualTo(String value) {\n            addCriterion(\"title >=\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleLessThan(String value) {\n            addCriterion(\"title <\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleLessThanOrEqualTo(String value) {\n            addCriterion(\"title <=\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleLike(String value) {\n            addCriterion(\"title like\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleNotLike(String value) {\n            addCriterion(\"title not like\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleIn(List<String> values) {\n            addCriterion(\"title in\", values, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleNotIn(List<String> values) {\n            addCriterion(\"title not in\", values, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleBetween(String value1, String value2) {\n            addCriterion(\"title between\", value1, value2, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleNotBetween(String value1, String value2) {\n            addCriterion(\"title not between\", value1, value2, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdIsNull() {\n            addCriterion(\"send_id is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdIsNotNull() {\n            addCriterion(\"send_id is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdEqualTo(Integer value) {\n            addCriterion(\"send_id =\", value, \"sendId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdNotEqualTo(Integer value) {\n            addCriterion(\"send_id <>\", value, \"sendId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdGreaterThan(Integer value) {\n            addCriterion(\"send_id >\", value, \"sendId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdGreaterThanOrEqualTo(Integer value) {\n            addCriterion(\"send_id >=\", value, \"sendId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdLessThan(Integer value) {\n            addCriterion(\"send_id <\", value, \"sendId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdLessThanOrEqualTo(Integer value) {\n            addCriterion(\"send_id <=\", value, \"sendId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdIn(List<Integer> values) {\n            addCriterion(\"send_id in\", values, \"sendId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdNotIn(List<Integer> values) {\n            addCriterion(\"send_id not in\", values, \"sendId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdBetween(Integer value1, Integer value2) {\n            addCriterion(\"send_id between\", value1, value2, \"sendId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdNotBetween(Integer value1, Integer value2) {\n            addCriterion(\"send_id not between\", value1, value2, \"sendId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andReceiveIdIsNull() {\n            addCriterion(\"receive_id is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andReceiveIdIsNotNull() {\n            addCriterion(\"receive_id is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andReceiveIdEqualTo(Integer value) {\n            addCriterion(\"receive_id =\", value, \"receiveId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andReceiveIdNotEqualTo(Integer value) {\n            addCriterion(\"receive_id <>\", value, \"receiveId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andReceiveIdGreaterThan(Integer value) {\n            addCriterion(\"receive_id >\", value, \"receiveId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andReceiveIdGreaterThanOrEqualTo(Integer value) {\n            addCriterion(\"receive_id >=\", value, \"receiveId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andReceiveIdLessThan(Integer value) {\n            addCriterion(\"receive_id <\", value, \"receiveId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andReceiveIdLessThanOrEqualTo(Integer value) {\n            addCriterion(\"receive_id <=\", value, \"receiveId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andReceiveIdIn(List<Integer> values) {\n            addCriterion(\"receive_id in\", values, \"receiveId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andReceiveIdNotIn(List<Integer> values) {\n            addCriterion(\"receive_id not in\", values, \"receiveId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andReceiveIdBetween(Integer value1, Integer value2) {\n            addCriterion(\"receive_id between\", value1, value2, \"receiveId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andReceiveIdNotBetween(Integer value1, Integer value2) {\n            addCriterion(\"receive_id not between\", value1, value2, \"receiveId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelIsNull() {\n            addCriterion(\"is_del is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelIsNotNull() {\n            addCriterion(\"is_del is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelEqualTo(String value) {\n            addCriterion(\"is_del =\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelNotEqualTo(String value) {\n            addCriterion(\"is_del <>\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelGreaterThan(String value) {\n            addCriterion(\"is_del >\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelGreaterThanOrEqualTo(String value) {\n            addCriterion(\"is_del >=\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelLessThan(String value) {\n            addCriterion(\"is_del <\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelLessThanOrEqualTo(String value) {\n            addCriterion(\"is_del <=\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelLike(String value) {\n            addCriterion(\"is_del like\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelNotLike(String value) {\n            addCriterion(\"is_del not like\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelIn(List<String> values) {\n            addCriterion(\"is_del in\", values, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelNotIn(List<String> values) {\n            addCriterion(\"is_del not in\", values, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelBetween(String value1, String value2) {\n            addCriterion(\"is_del between\", value1, value2, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelNotBetween(String value1, String value2) {\n            addCriterion(\"is_del not between\", value1, value2, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIsNull() {\n            addCriterion(\"create_time is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIsNotNull() {\n            addCriterion(\"create_time is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeEqualTo(Date value) {\n            addCriterion(\"create_time =\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotEqualTo(Date value) {\n            addCriterion(\"create_time <>\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeGreaterThan(Date value) {\n            addCriterion(\"create_time >\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {\n            addCriterion(\"create_time >=\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeLessThan(Date value) {\n            addCriterion(\"create_time <\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {\n            addCriterion(\"create_time <=\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIn(List<Date> values) {\n            addCriterion(\"create_time in\", values, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotIn(List<Date> values) {\n            addCriterion(\"create_time not in\", values, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeBetween(Date value1, Date value2) {\n            addCriterion(\"create_time between\", value1, value2, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {\n            addCriterion(\"create_time not between\", value1, value2, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIsNull() {\n            addCriterion(\"update_time is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIsNotNull() {\n            addCriterion(\"update_time is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeEqualTo(Date value) {\n            addCriterion(\"update_time =\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotEqualTo(Date value) {\n            addCriterion(\"update_time <>\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeGreaterThan(Date value) {\n            addCriterion(\"update_time >\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) {\n            addCriterion(\"update_time >=\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeLessThan(Date value) {\n            addCriterion(\"update_time <\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeLessThanOrEqualTo(Date value) {\n            addCriterion(\"update_time <=\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIn(List<Date> values) {\n            addCriterion(\"update_time in\", values, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotIn(List<Date> values) {\n            addCriterion(\"update_time not in\", values, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeBetween(Date value1, Date value2) {\n            addCriterion(\"update_time between\", value1, value2, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotBetween(Date value1, Date value2) {\n            addCriterion(\"update_time not between\", value1, value2, \"updateTime\");\n            return (Criteria) this;\n        }\n    }\n\n    /**\n     */\n    public static class Criteria extends GeneratedCriteria {\n\n        protected Criteria() {\n            super();\n        }\n    }\n\n    public static class Criterion {\n        private String condition;\n\n        private Object value;\n\n        private Object secondValue;\n\n        private boolean noValue;\n\n        private boolean singleValue;\n\n        private boolean betweenValue;\n\n        private boolean listValue;\n\n        private String typeHandler;\n\n        public String getCondition() {\n            return condition;\n        }\n\n        public Object getValue() {\n            return value;\n        }\n\n        public Object getSecondValue() {\n            return secondValue;\n        }\n\n        public boolean isNoValue() {\n            return noValue;\n        }\n\n        public boolean isSingleValue() {\n            return singleValue;\n        }\n\n        public boolean isBetweenValue() {\n            return betweenValue;\n        }\n\n        public boolean isListValue() {\n            return listValue;\n        }\n\n        public String getTypeHandler() {\n            return typeHandler;\n        }\n\n        protected Criterion(String condition) {\n            super();\n            this.condition = condition;\n            this.typeHandler = null;\n            this.noValue = true;\n        }\n\n        protected Criterion(String condition, Object value, String typeHandler) {\n            super();\n            this.condition = condition;\n            this.value = value;\n            this.typeHandler = typeHandler;\n            if (value instanceof List<?>) {\n                this.listValue = true;\n            } else {\n                this.singleValue = true;\n            }\n        }\n\n        protected Criterion(String condition, Object value) {\n            this(condition, value, null);\n        }\n\n        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {\n            super();\n            this.condition = condition;\n            this.value = value;\n            this.secondValue = secondValue;\n            this.typeHandler = typeHandler;\n            this.betweenValue = true;\n        }\n\n        protected Criterion(String condition, Object value, Object secondValue) {\n            this(condition, value, secondValue, null);\n        }\n    }\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/model/Notices.java",
    "content": "package com.zmh.projectoa.model;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @author \n */\npublic class Notices implements Serializable {\n    private Integer id;\n\n    private String title;\n\n    private Integer sendId;\n\n    private String isDel;\n\n    private Date createTime;\n\n    private Date updateTime;\n\n    private String notice;\n\n    private static final long serialVersionUID = 1L;\n\n    public Integer getId() {\n        return id;\n    }\n\n    public void setId(Integer id) {\n        this.id = id;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public void setTitle(String title) {\n        this.title = title;\n    }\n\n    public Integer getSendId() {\n        return sendId;\n    }\n\n    public void setSendId(Integer sendId) {\n        this.sendId = sendId;\n    }\n\n    public String getIsDel() {\n        return isDel;\n    }\n\n    public void setIsDel(String isDel) {\n        this.isDel = isDel;\n    }\n\n    public Date getCreateTime() {\n        return createTime;\n    }\n\n    public void setCreateTime(Date createTime) {\n        this.createTime = createTime;\n    }\n\n    public Date getUpdateTime() {\n        return updateTime;\n    }\n\n    public void setUpdateTime(Date updateTime) {\n        this.updateTime = updateTime;\n    }\n\n    public String getNotice() {\n        return notice;\n    }\n\n    public void setNotice(String notice) {\n        this.notice = notice;\n    }\n\n    @Override\n    public boolean equals(Object that) {\n        if (this == that) {\n            return true;\n        }\n        if (that == null) {\n            return false;\n        }\n        if (getClass() != that.getClass()) {\n            return false;\n        }\n        Notices other = (Notices) that;\n        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))\n            && (this.getTitle() == null ? other.getTitle() == null : this.getTitle().equals(other.getTitle()))\n            && (this.getSendId() == null ? other.getSendId() == null : this.getSendId().equals(other.getSendId()))\n            && (this.getIsDel() == null ? other.getIsDel() == null : this.getIsDel().equals(other.getIsDel()))\n            && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()))\n            && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime()))\n            && (this.getNotice() == null ? other.getNotice() == null : this.getNotice().equals(other.getNotice()));\n    }\n\n    @Override\n    public int hashCode() {\n        final int prime = 31;\n        int result = 1;\n        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());\n        result = prime * result + ((getTitle() == null) ? 0 : getTitle().hashCode());\n        result = prime * result + ((getSendId() == null) ? 0 : getSendId().hashCode());\n        result = prime * result + ((getIsDel() == null) ? 0 : getIsDel().hashCode());\n        result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());\n        result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode());\n        result = prime * result + ((getNotice() == null) ? 0 : getNotice().hashCode());\n        return result;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", id=\").append(id);\n        sb.append(\", title=\").append(title);\n        sb.append(\", sendId=\").append(sendId);\n        sb.append(\", isDel=\").append(isDel);\n        sb.append(\", createTime=\").append(createTime);\n        sb.append(\", updateTime=\").append(updateTime);\n        sb.append(\", notice=\").append(notice);\n        sb.append(\", serialVersionUID=\").append(serialVersionUID);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/model/NoticesExample.java",
    "content": "package com.zmh.projectoa.model;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\n\npublic class NoticesExample {\n    protected String orderByClause;\n\n    protected boolean distinct;\n\n    protected List<Criteria> oredCriteria;\n\n    private Integer limit;\n\n    private Integer offset;\n\n    public NoticesExample() {\n        oredCriteria = new ArrayList<Criteria>();\n    }\n\n    public void setOrderByClause(String orderByClause) {\n        this.orderByClause = orderByClause;\n    }\n\n    public String getOrderByClause() {\n        return orderByClause;\n    }\n\n    public void setDistinct(boolean distinct) {\n        this.distinct = distinct;\n    }\n\n    public boolean isDistinct() {\n        return distinct;\n    }\n\n    public List<Criteria> getOredCriteria() {\n        return oredCriteria;\n    }\n\n    public void or(Criteria criteria) {\n        oredCriteria.add(criteria);\n    }\n\n    public Criteria or() {\n        Criteria criteria = createCriteriaInternal();\n        oredCriteria.add(criteria);\n        return criteria;\n    }\n\n    public Criteria createCriteria() {\n        Criteria criteria = createCriteriaInternal();\n        if (oredCriteria.size() == 0) {\n            oredCriteria.add(criteria);\n        }\n        return criteria;\n    }\n\n    protected Criteria createCriteriaInternal() {\n        Criteria criteria = new Criteria();\n        return criteria;\n    }\n\n    public void clear() {\n        oredCriteria.clear();\n        orderByClause = null;\n        distinct = false;\n    }\n\n    public void setLimit(Integer limit) {\n        this.limit = limit;\n    }\n\n    public Integer getLimit() {\n        return limit;\n    }\n\n    public void setOffset(Integer offset) {\n        this.offset = offset;\n    }\n\n    public Integer getOffset() {\n        return offset;\n    }\n\n    protected abstract static class GeneratedCriteria {\n        protected List<Criterion> criteria;\n\n        protected GeneratedCriteria() {\n            super();\n            criteria = new ArrayList<Criterion>();\n        }\n\n        public boolean isValid() {\n            return criteria.size() > 0;\n        }\n\n        public List<Criterion> getAllCriteria() {\n            return criteria;\n        }\n\n        public List<Criterion> getCriteria() {\n            return criteria;\n        }\n\n        protected void addCriterion(String condition) {\n            if (condition == null) {\n                throw new RuntimeException(\"Value for condition cannot be null\");\n            }\n            criteria.add(new Criterion(condition));\n        }\n\n        protected void addCriterion(String condition, Object value, String property) {\n            if (value == null) {\n                throw new RuntimeException(\"Value for \" + property + \" cannot be null\");\n            }\n            criteria.add(new Criterion(condition, value));\n        }\n\n        protected void addCriterion(String condition, Object value1, Object value2, String property) {\n            if (value1 == null || value2 == null) {\n                throw new RuntimeException(\"Between values for \" + property + \" cannot be null\");\n            }\n            criteria.add(new Criterion(condition, value1, value2));\n        }\n\n        public Criteria andIdIsNull() {\n            addCriterion(\"id is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdIsNotNull() {\n            addCriterion(\"id is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdEqualTo(Integer value) {\n            addCriterion(\"id =\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotEqualTo(Integer value) {\n            addCriterion(\"id <>\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdGreaterThan(Integer value) {\n            addCriterion(\"id >\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdGreaterThanOrEqualTo(Integer value) {\n            addCriterion(\"id >=\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdLessThan(Integer value) {\n            addCriterion(\"id <\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdLessThanOrEqualTo(Integer value) {\n            addCriterion(\"id <=\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdIn(List<Integer> values) {\n            addCriterion(\"id in\", values, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotIn(List<Integer> values) {\n            addCriterion(\"id not in\", values, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdBetween(Integer value1, Integer value2) {\n            addCriterion(\"id between\", value1, value2, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotBetween(Integer value1, Integer value2) {\n            addCriterion(\"id not between\", value1, value2, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleIsNull() {\n            addCriterion(\"title is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleIsNotNull() {\n            addCriterion(\"title is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleEqualTo(String value) {\n            addCriterion(\"title =\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleNotEqualTo(String value) {\n            addCriterion(\"title <>\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleGreaterThan(String value) {\n            addCriterion(\"title >\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleGreaterThanOrEqualTo(String value) {\n            addCriterion(\"title >=\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleLessThan(String value) {\n            addCriterion(\"title <\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleLessThanOrEqualTo(String value) {\n            addCriterion(\"title <=\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleLike(String value) {\n            addCriterion(\"title like\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleNotLike(String value) {\n            addCriterion(\"title not like\", value, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleIn(List<String> values) {\n            addCriterion(\"title in\", values, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleNotIn(List<String> values) {\n            addCriterion(\"title not in\", values, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleBetween(String value1, String value2) {\n            addCriterion(\"title between\", value1, value2, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andTitleNotBetween(String value1, String value2) {\n            addCriterion(\"title not between\", value1, value2, \"title\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdIsNull() {\n            addCriterion(\"send_id is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdIsNotNull() {\n            addCriterion(\"send_id is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdEqualTo(Integer value) {\n            addCriterion(\"send_id =\", value, \"sendId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdNotEqualTo(Integer value) {\n            addCriterion(\"send_id <>\", value, \"sendId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdGreaterThan(Integer value) {\n            addCriterion(\"send_id >\", value, \"sendId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdGreaterThanOrEqualTo(Integer value) {\n            addCriterion(\"send_id >=\", value, \"sendId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdLessThan(Integer value) {\n            addCriterion(\"send_id <\", value, \"sendId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdLessThanOrEqualTo(Integer value) {\n            addCriterion(\"send_id <=\", value, \"sendId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdIn(List<Integer> values) {\n            addCriterion(\"send_id in\", values, \"sendId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdNotIn(List<Integer> values) {\n            addCriterion(\"send_id not in\", values, \"sendId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdBetween(Integer value1, Integer value2) {\n            addCriterion(\"send_id between\", value1, value2, \"sendId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSendIdNotBetween(Integer value1, Integer value2) {\n            addCriterion(\"send_id not between\", value1, value2, \"sendId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelIsNull() {\n            addCriterion(\"is_del is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelIsNotNull() {\n            addCriterion(\"is_del is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelEqualTo(String value) {\n            addCriterion(\"is_del =\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelNotEqualTo(String value) {\n            addCriterion(\"is_del <>\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelGreaterThan(String value) {\n            addCriterion(\"is_del >\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelGreaterThanOrEqualTo(String value) {\n            addCriterion(\"is_del >=\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelLessThan(String value) {\n            addCriterion(\"is_del <\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelLessThanOrEqualTo(String value) {\n            addCriterion(\"is_del <=\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelLike(String value) {\n            addCriterion(\"is_del like\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelNotLike(String value) {\n            addCriterion(\"is_del not like\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelIn(List<String> values) {\n            addCriterion(\"is_del in\", values, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelNotIn(List<String> values) {\n            addCriterion(\"is_del not in\", values, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelBetween(String value1, String value2) {\n            addCriterion(\"is_del between\", value1, value2, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelNotBetween(String value1, String value2) {\n            addCriterion(\"is_del not between\", value1, value2, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIsNull() {\n            addCriterion(\"create_time is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIsNotNull() {\n            addCriterion(\"create_time is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeEqualTo(Date value) {\n            addCriterion(\"create_time =\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotEqualTo(Date value) {\n            addCriterion(\"create_time <>\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeGreaterThan(Date value) {\n            addCriterion(\"create_time >\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {\n            addCriterion(\"create_time >=\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeLessThan(Date value) {\n            addCriterion(\"create_time <\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {\n            addCriterion(\"create_time <=\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIn(List<Date> values) {\n            addCriterion(\"create_time in\", values, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotIn(List<Date> values) {\n            addCriterion(\"create_time not in\", values, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeBetween(Date value1, Date value2) {\n            addCriterion(\"create_time between\", value1, value2, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {\n            addCriterion(\"create_time not between\", value1, value2, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIsNull() {\n            addCriterion(\"update_time is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIsNotNull() {\n            addCriterion(\"update_time is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeEqualTo(Date value) {\n            addCriterion(\"update_time =\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotEqualTo(Date value) {\n            addCriterion(\"update_time <>\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeGreaterThan(Date value) {\n            addCriterion(\"update_time >\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) {\n            addCriterion(\"update_time >=\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeLessThan(Date value) {\n            addCriterion(\"update_time <\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeLessThanOrEqualTo(Date value) {\n            addCriterion(\"update_time <=\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIn(List<Date> values) {\n            addCriterion(\"update_time in\", values, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotIn(List<Date> values) {\n            addCriterion(\"update_time not in\", values, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeBetween(Date value1, Date value2) {\n            addCriterion(\"update_time between\", value1, value2, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotBetween(Date value1, Date value2) {\n            addCriterion(\"update_time not between\", value1, value2, \"updateTime\");\n            return (Criteria) this;\n        }\n    }\n\n    /**\n     */\n    public static class Criteria extends GeneratedCriteria {\n\n        protected Criteria() {\n            super();\n        }\n    }\n\n    public static class Criterion {\n        private String condition;\n\n        private Object value;\n\n        private Object secondValue;\n\n        private boolean noValue;\n\n        private boolean singleValue;\n\n        private boolean betweenValue;\n\n        private boolean listValue;\n\n        private String typeHandler;\n\n        public String getCondition() {\n            return condition;\n        }\n\n        public Object getValue() {\n            return value;\n        }\n\n        public Object getSecondValue() {\n            return secondValue;\n        }\n\n        public boolean isNoValue() {\n            return noValue;\n        }\n\n        public boolean isSingleValue() {\n            return singleValue;\n        }\n\n        public boolean isBetweenValue() {\n            return betweenValue;\n        }\n\n        public boolean isListValue() {\n            return listValue;\n        }\n\n        public String getTypeHandler() {\n            return typeHandler;\n        }\n\n        protected Criterion(String condition) {\n            super();\n            this.condition = condition;\n            this.typeHandler = null;\n            this.noValue = true;\n        }\n\n        protected Criterion(String condition, Object value, String typeHandler) {\n            super();\n            this.condition = condition;\n            this.value = value;\n            this.typeHandler = typeHandler;\n            if (value instanceof List<?>) {\n                this.listValue = true;\n            } else {\n                this.singleValue = true;\n            }\n        }\n\n        protected Criterion(String condition, Object value) {\n            this(condition, value, null);\n        }\n\n        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {\n            super();\n            this.condition = condition;\n            this.value = value;\n            this.secondValue = secondValue;\n            this.typeHandler = typeHandler;\n            this.betweenValue = true;\n        }\n\n        protected Criterion(String condition, Object value, Object secondValue) {\n            this(condition, value, secondValue, null);\n        }\n    }\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/model/Positions.java",
    "content": "package com.zmh.projectoa.model;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @author \n */\npublic class Positions implements Serializable {\n    private Integer id;\n\n    private String position;\n\n    private Date createTime;\n\n    private Date updateTime;\n\n    private static final long serialVersionUID = 1L;\n\n    public Integer getId() {\n        return id;\n    }\n\n    public void setId(Integer id) {\n        this.id = id;\n    }\n\n    public String getPosition() {\n        return position;\n    }\n\n    public void setPosition(String position) {\n        this.position = position;\n    }\n\n    public Date getCreateTime() {\n        return createTime;\n    }\n\n    public void setCreateTime(Date createTime) {\n        this.createTime = createTime;\n    }\n\n    public Date getUpdateTime() {\n        return updateTime;\n    }\n\n    public void setUpdateTime(Date updateTime) {\n        this.updateTime = updateTime;\n    }\n\n    @Override\n    public boolean equals(Object that) {\n        if (this == that) {\n            return true;\n        }\n        if (that == null) {\n            return false;\n        }\n        if (getClass() != that.getClass()) {\n            return false;\n        }\n        Positions other = (Positions) that;\n        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))\n            && (this.getPosition() == null ? other.getPosition() == null : this.getPosition().equals(other.getPosition()))\n            && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()))\n            && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime()));\n    }\n\n    @Override\n    public int hashCode() {\n        final int prime = 31;\n        int result = 1;\n        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());\n        result = prime * result + ((getPosition() == null) ? 0 : getPosition().hashCode());\n        result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());\n        result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode());\n        return result;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", id=\").append(id);\n        sb.append(\", position=\").append(position);\n        sb.append(\", createTime=\").append(createTime);\n        sb.append(\", updateTime=\").append(updateTime);\n        sb.append(\", serialVersionUID=\").append(serialVersionUID);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/model/PositionsExample.java",
    "content": "package com.zmh.projectoa.model;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\n\npublic class PositionsExample {\n    protected String orderByClause;\n\n    protected boolean distinct;\n\n    protected List<Criteria> oredCriteria;\n\n    private Integer limit;\n\n    private Integer offset;\n\n    public PositionsExample() {\n        oredCriteria = new ArrayList<Criteria>();\n    }\n\n    public void setOrderByClause(String orderByClause) {\n        this.orderByClause = orderByClause;\n    }\n\n    public String getOrderByClause() {\n        return orderByClause;\n    }\n\n    public void setDistinct(boolean distinct) {\n        this.distinct = distinct;\n    }\n\n    public boolean isDistinct() {\n        return distinct;\n    }\n\n    public List<Criteria> getOredCriteria() {\n        return oredCriteria;\n    }\n\n    public void or(Criteria criteria) {\n        oredCriteria.add(criteria);\n    }\n\n    public Criteria or() {\n        Criteria criteria = createCriteriaInternal();\n        oredCriteria.add(criteria);\n        return criteria;\n    }\n\n    public Criteria createCriteria() {\n        Criteria criteria = createCriteriaInternal();\n        if (oredCriteria.size() == 0) {\n            oredCriteria.add(criteria);\n        }\n        return criteria;\n    }\n\n    protected Criteria createCriteriaInternal() {\n        Criteria criteria = new Criteria();\n        return criteria;\n    }\n\n    public void clear() {\n        oredCriteria.clear();\n        orderByClause = null;\n        distinct = false;\n    }\n\n    public void setLimit(Integer limit) {\n        this.limit = limit;\n    }\n\n    public Integer getLimit() {\n        return limit;\n    }\n\n    public void setOffset(Integer offset) {\n        this.offset = offset;\n    }\n\n    public Integer getOffset() {\n        return offset;\n    }\n\n    protected abstract static class GeneratedCriteria {\n        protected List<Criterion> criteria;\n\n        protected GeneratedCriteria() {\n            super();\n            criteria = new ArrayList<Criterion>();\n        }\n\n        public boolean isValid() {\n            return criteria.size() > 0;\n        }\n\n        public List<Criterion> getAllCriteria() {\n            return criteria;\n        }\n\n        public List<Criterion> getCriteria() {\n            return criteria;\n        }\n\n        protected void addCriterion(String condition) {\n            if (condition == null) {\n                throw new RuntimeException(\"Value for condition cannot be null\");\n            }\n            criteria.add(new Criterion(condition));\n        }\n\n        protected void addCriterion(String condition, Object value, String property) {\n            if (value == null) {\n                throw new RuntimeException(\"Value for \" + property + \" cannot be null\");\n            }\n            criteria.add(new Criterion(condition, value));\n        }\n\n        protected void addCriterion(String condition, Object value1, Object value2, String property) {\n            if (value1 == null || value2 == null) {\n                throw new RuntimeException(\"Between values for \" + property + \" cannot be null\");\n            }\n            criteria.add(new Criterion(condition, value1, value2));\n        }\n\n        public Criteria andIdIsNull() {\n            addCriterion(\"id is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdIsNotNull() {\n            addCriterion(\"id is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdEqualTo(Integer value) {\n            addCriterion(\"id =\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotEqualTo(Integer value) {\n            addCriterion(\"id <>\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdGreaterThan(Integer value) {\n            addCriterion(\"id >\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdGreaterThanOrEqualTo(Integer value) {\n            addCriterion(\"id >=\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdLessThan(Integer value) {\n            addCriterion(\"id <\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdLessThanOrEqualTo(Integer value) {\n            addCriterion(\"id <=\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdIn(List<Integer> values) {\n            addCriterion(\"id in\", values, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotIn(List<Integer> values) {\n            addCriterion(\"id not in\", values, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdBetween(Integer value1, Integer value2) {\n            addCriterion(\"id between\", value1, value2, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotBetween(Integer value1, Integer value2) {\n            addCriterion(\"id not between\", value1, value2, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionIsNull() {\n            addCriterion(\"position is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionIsNotNull() {\n            addCriterion(\"position is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionEqualTo(String value) {\n            addCriterion(\"position =\", value, \"position\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionNotEqualTo(String value) {\n            addCriterion(\"position <>\", value, \"position\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionGreaterThan(String value) {\n            addCriterion(\"position >\", value, \"position\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionGreaterThanOrEqualTo(String value) {\n            addCriterion(\"position >=\", value, \"position\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionLessThan(String value) {\n            addCriterion(\"position <\", value, \"position\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionLessThanOrEqualTo(String value) {\n            addCriterion(\"position <=\", value, \"position\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionLike(String value) {\n            addCriterion(\"position like\", value, \"position\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionNotLike(String value) {\n            addCriterion(\"position not like\", value, \"position\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionIn(List<String> values) {\n            addCriterion(\"position in\", values, \"position\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionNotIn(List<String> values) {\n            addCriterion(\"position not in\", values, \"position\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionBetween(String value1, String value2) {\n            addCriterion(\"position between\", value1, value2, \"position\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionNotBetween(String value1, String value2) {\n            addCriterion(\"position not between\", value1, value2, \"position\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIsNull() {\n            addCriterion(\"create_time is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIsNotNull() {\n            addCriterion(\"create_time is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeEqualTo(Date value) {\n            addCriterion(\"create_time =\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotEqualTo(Date value) {\n            addCriterion(\"create_time <>\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeGreaterThan(Date value) {\n            addCriterion(\"create_time >\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {\n            addCriterion(\"create_time >=\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeLessThan(Date value) {\n            addCriterion(\"create_time <\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {\n            addCriterion(\"create_time <=\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIn(List<Date> values) {\n            addCriterion(\"create_time in\", values, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotIn(List<Date> values) {\n            addCriterion(\"create_time not in\", values, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeBetween(Date value1, Date value2) {\n            addCriterion(\"create_time between\", value1, value2, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {\n            addCriterion(\"create_time not between\", value1, value2, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIsNull() {\n            addCriterion(\"update_time is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIsNotNull() {\n            addCriterion(\"update_time is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeEqualTo(Date value) {\n            addCriterion(\"update_time =\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotEqualTo(Date value) {\n            addCriterion(\"update_time <>\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeGreaterThan(Date value) {\n            addCriterion(\"update_time >\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) {\n            addCriterion(\"update_time >=\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeLessThan(Date value) {\n            addCriterion(\"update_time <\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeLessThanOrEqualTo(Date value) {\n            addCriterion(\"update_time <=\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIn(List<Date> values) {\n            addCriterion(\"update_time in\", values, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotIn(List<Date> values) {\n            addCriterion(\"update_time not in\", values, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeBetween(Date value1, Date value2) {\n            addCriterion(\"update_time between\", value1, value2, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotBetween(Date value1, Date value2) {\n            addCriterion(\"update_time not between\", value1, value2, \"updateTime\");\n            return (Criteria) this;\n        }\n    }\n\n    /**\n     */\n    public static class Criteria extends GeneratedCriteria {\n\n        protected Criteria() {\n            super();\n        }\n    }\n\n    public static class Criterion {\n        private String condition;\n\n        private Object value;\n\n        private Object secondValue;\n\n        private boolean noValue;\n\n        private boolean singleValue;\n\n        private boolean betweenValue;\n\n        private boolean listValue;\n\n        private String typeHandler;\n\n        public String getCondition() {\n            return condition;\n        }\n\n        public Object getValue() {\n            return value;\n        }\n\n        public Object getSecondValue() {\n            return secondValue;\n        }\n\n        public boolean isNoValue() {\n            return noValue;\n        }\n\n        public boolean isSingleValue() {\n            return singleValue;\n        }\n\n        public boolean isBetweenValue() {\n            return betweenValue;\n        }\n\n        public boolean isListValue() {\n            return listValue;\n        }\n\n        public String getTypeHandler() {\n            return typeHandler;\n        }\n\n        protected Criterion(String condition) {\n            super();\n            this.condition = condition;\n            this.typeHandler = null;\n            this.noValue = true;\n        }\n\n        protected Criterion(String condition, Object value, String typeHandler) {\n            super();\n            this.condition = condition;\n            this.value = value;\n            this.typeHandler = typeHandler;\n            if (value instanceof List<?>) {\n                this.listValue = true;\n            } else {\n                this.singleValue = true;\n            }\n        }\n\n        protected Criterion(String condition, Object value) {\n            this(condition, value, null);\n        }\n\n        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {\n            super();\n            this.condition = condition;\n            this.value = value;\n            this.secondValue = secondValue;\n            this.typeHandler = typeHandler;\n            this.betweenValue = true;\n        }\n\n        protected Criterion(String condition, Object value, Object secondValue) {\n            this(condition, value, secondValue, null);\n        }\n    }\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/model/Userinfo.java",
    "content": "package com.zmh.projectoa.model;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @author \n */\npublic class Userinfo implements Serializable {\n    private Integer id;\n\n    private Integer userId;\n\n    private String sex;\n\n    private Date birthday;\n\n    private Integer age;\n\n    private String identityCard;\n\n    private String email;\n\n    private Integer qq;\n\n    private String wechat;\n\n    private String weibo;\n\n    private String phone;\n\n    private String isDel;\n\n    private Date createTime;\n\n    private Date updateTime;\n\n    private Integer headImage;\n\n    public Integer getHeadImage() {\n        return headImage;\n    }\n\n    public void setHeadImage(Integer headImage) {\n        this.headImage = headImage;\n    }\n\n    private static final long serialVersionUID = 1L;\n\n    public Integer getId() {\n        return id;\n    }\n\n    public void setId(Integer id) {\n        this.id = id;\n    }\n\n    public Integer getUserId() {\n        return userId;\n    }\n\n    public void setUserId(Integer userId) {\n        this.userId = userId;\n    }\n\n    public String getSex() {\n        return sex;\n    }\n\n    public void setSex(String sex) {\n        this.sex = sex;\n    }\n\n    public Date getBirthday() {\n        return birthday;\n    }\n\n    public void setBirthday(Date birthday) {\n        this.birthday = birthday;\n    }\n\n    public Integer getAge() {\n        return age;\n    }\n\n    public void setAge(Integer age) {\n        this.age = age;\n    }\n\n    public String getIdentityCard() {\n        return identityCard;\n    }\n\n    public void setIdentityCard(String identityCard) {\n        this.identityCard = identityCard;\n    }\n\n    public String getEmail() {\n        return email;\n    }\n\n    public void setEmail(String email) {\n        this.email = email;\n    }\n\n    public Integer getQq() {\n        return qq;\n    }\n\n    public void setQq(Integer qq) {\n        this.qq = qq;\n    }\n\n    public String getWechat() {\n        return wechat;\n    }\n\n    public void setWechat(String wechat) {\n        this.wechat = wechat;\n    }\n\n    public String getWeibo() {\n        return weibo;\n    }\n\n    public void setWeibo(String weibo) {\n        this.weibo = weibo;\n    }\n\n    public String getPhone() {\n        return phone;\n    }\n\n    public void setPhone(String phone) {\n        this.phone = phone;\n    }\n\n    public String getIsDel() {\n        return isDel;\n    }\n\n    public void setIsDel(String isDel) {\n        this.isDel = isDel;\n    }\n\n    public Date getCreateTime() {\n        return createTime;\n    }\n\n    public void setCreateTime(Date createTime) {\n        this.createTime = createTime;\n    }\n\n    public Date getUpdateTime() {\n        return updateTime;\n    }\n\n    public void setUpdateTime(Date updateTime) {\n        this.updateTime = updateTime;\n    }\n\n    @Override\n    public boolean equals(Object that) {\n        if (this == that) {\n            return true;\n        }\n        if (that == null) {\n            return false;\n        }\n        if (getClass() != that.getClass()) {\n            return false;\n        }\n        Userinfo other = (Userinfo) that;\n        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))\n            && (this.getUserId() == null ? other.getUserId() == null : this.getUserId().equals(other.getUserId()))\n            && (this.getSex() == null ? other.getSex() == null : this.getSex().equals(other.getSex()))\n            && (this.getBirthday() == null ? other.getBirthday() == null : this.getBirthday().equals(other.getBirthday()))\n            && (this.getAge() == null ? other.getAge() == null : this.getAge().equals(other.getAge()))\n            && (this.getIdentityCard() == null ? other.getIdentityCard() == null : this.getIdentityCard().equals(other.getIdentityCard()))\n            && (this.getEmail() == null ? other.getEmail() == null : this.getEmail().equals(other.getEmail()))\n            && (this.getQq() == null ? other.getQq() == null : this.getQq().equals(other.getQq()))\n            && (this.getWechat() == null ? other.getWechat() == null : this.getWechat().equals(other.getWechat()))\n            && (this.getWeibo() == null ? other.getWeibo() == null : this.getWeibo().equals(other.getWeibo()))\n            && (this.getPhone() == null ? other.getPhone() == null : this.getPhone().equals(other.getPhone()))\n            && (this.getIsDel() == null ? other.getIsDel() == null : this.getIsDel().equals(other.getIsDel()))\n            && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()))\n            && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime()));\n    }\n\n    @Override\n    public int hashCode() {\n        final int prime = 31;\n        int result = 1;\n        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());\n        result = prime * result + ((getUserId() == null) ? 0 : getUserId().hashCode());\n        result = prime * result + ((getSex() == null) ? 0 : getSex().hashCode());\n        result = prime * result + ((getBirthday() == null) ? 0 : getBirthday().hashCode());\n        result = prime * result + ((getAge() == null) ? 0 : getAge().hashCode());\n        result = prime * result + ((getIdentityCard() == null) ? 0 : getIdentityCard().hashCode());\n        result = prime * result + ((getEmail() == null) ? 0 : getEmail().hashCode());\n        result = prime * result + ((getQq() == null) ? 0 : getQq().hashCode());\n        result = prime * result + ((getWechat() == null) ? 0 : getWechat().hashCode());\n        result = prime * result + ((getWeibo() == null) ? 0 : getWeibo().hashCode());\n        result = prime * result + ((getPhone() == null) ? 0 : getPhone().hashCode());\n        result = prime * result + ((getIsDel() == null) ? 0 : getIsDel().hashCode());\n        result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());\n        result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode());\n        return result;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", id=\").append(id);\n        sb.append(\", userId=\").append(userId);\n        sb.append(\", sex=\").append(sex);\n        sb.append(\", birthday=\").append(birthday);\n        sb.append(\", age=\").append(age);\n        sb.append(\", identityCard=\").append(identityCard);\n        sb.append(\", email=\").append(email);\n        sb.append(\", qq=\").append(qq);\n        sb.append(\", wechat=\").append(wechat);\n        sb.append(\", weibo=\").append(weibo);\n        sb.append(\", phone=\").append(phone);\n        sb.append(\", isDel=\").append(isDel);\n        sb.append(\", createTime=\").append(createTime);\n        sb.append(\", updateTime=\").append(updateTime);\n        sb.append(\", serialVersionUID=\").append(serialVersionUID);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/model/UserinfoExample.java",
    "content": "package com.zmh.projectoa.model;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.Iterator;\nimport java.util.List;\n\npublic class UserinfoExample {\n    protected String orderByClause;\n\n    protected boolean distinct;\n\n    protected List<Criteria> oredCriteria;\n\n    private Integer limit;\n\n    private Integer offset;\n\n    public UserinfoExample() {\n        oredCriteria = new ArrayList<Criteria>();\n    }\n\n    public void setOrderByClause(String orderByClause) {\n        this.orderByClause = orderByClause;\n    }\n\n    public String getOrderByClause() {\n        return orderByClause;\n    }\n\n    public void setDistinct(boolean distinct) {\n        this.distinct = distinct;\n    }\n\n    public boolean isDistinct() {\n        return distinct;\n    }\n\n    public List<Criteria> getOredCriteria() {\n        return oredCriteria;\n    }\n\n    public void or(Criteria criteria) {\n        oredCriteria.add(criteria);\n    }\n\n    public Criteria or() {\n        Criteria criteria = createCriteriaInternal();\n        oredCriteria.add(criteria);\n        return criteria;\n    }\n\n    public Criteria createCriteria() {\n        Criteria criteria = createCriteriaInternal();\n        if (oredCriteria.size() == 0) {\n            oredCriteria.add(criteria);\n        }\n        return criteria;\n    }\n\n    protected Criteria createCriteriaInternal() {\n        Criteria criteria = new Criteria();\n        return criteria;\n    }\n\n    public void clear() {\n        oredCriteria.clear();\n        orderByClause = null;\n        distinct = false;\n    }\n\n    public void setLimit(Integer limit) {\n        this.limit = limit;\n    }\n\n    public Integer getLimit() {\n        return limit;\n    }\n\n    public void setOffset(Integer offset) {\n        this.offset = offset;\n    }\n\n    public Integer getOffset() {\n        return offset;\n    }\n\n    protected abstract static class GeneratedCriteria {\n        protected List<Criterion> criteria;\n\n        protected GeneratedCriteria() {\n            super();\n            criteria = new ArrayList<Criterion>();\n        }\n\n        public boolean isValid() {\n            return criteria.size() > 0;\n        }\n\n        public List<Criterion> getAllCriteria() {\n            return criteria;\n        }\n\n        public List<Criterion> getCriteria() {\n            return criteria;\n        }\n\n        protected void addCriterion(String condition) {\n            if (condition == null) {\n                throw new RuntimeException(\"Value for condition cannot be null\");\n            }\n            criteria.add(new Criterion(condition));\n        }\n\n        protected void addCriterion(String condition, Object value, String property) {\n            if (value == null) {\n                throw new RuntimeException(\"Value for \" + property + \" cannot be null\");\n            }\n            criteria.add(new Criterion(condition, value));\n        }\n\n        protected void addCriterion(String condition, Object value1, Object value2, String property) {\n            if (value1 == null || value2 == null) {\n                throw new RuntimeException(\"Between values for \" + property + \" cannot be null\");\n            }\n            criteria.add(new Criterion(condition, value1, value2));\n        }\n\n        protected void addCriterionForJDBCDate(String condition, Date value, String property) {\n            if (value == null) {\n                throw new RuntimeException(\"Value for \" + property + \" cannot be null\");\n            }\n            addCriterion(condition, new java.sql.Date(value.getTime()), property);\n        }\n\n        protected void addCriterionForJDBCDate(String condition, List<Date> values, String property) {\n            if (values == null || values.size() == 0) {\n                throw new RuntimeException(\"Value list for \" + property + \" cannot be null or empty\");\n            }\n            List<java.sql.Date> dateList = new ArrayList<java.sql.Date>();\n            Iterator<Date> iter = values.iterator();\n            while (iter.hasNext()) {\n                dateList.add(new java.sql.Date(iter.next().getTime()));\n            }\n            addCriterion(condition, dateList, property);\n        }\n\n        protected void addCriterionForJDBCDate(String condition, Date value1, Date value2, String property) {\n            if (value1 == null || value2 == null) {\n                throw new RuntimeException(\"Between values for \" + property + \" cannot be null\");\n            }\n            addCriterion(condition, new java.sql.Date(value1.getTime()), new java.sql.Date(value2.getTime()), property);\n        }\n\n        public Criteria andIdIsNull() {\n            addCriterion(\"id is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdIsNotNull() {\n            addCriterion(\"id is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdEqualTo(Integer value) {\n            addCriterion(\"id =\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotEqualTo(Integer value) {\n            addCriterion(\"id <>\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdGreaterThan(Integer value) {\n            addCriterion(\"id >\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdGreaterThanOrEqualTo(Integer value) {\n            addCriterion(\"id >=\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdLessThan(Integer value) {\n            addCriterion(\"id <\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdLessThanOrEqualTo(Integer value) {\n            addCriterion(\"id <=\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdIn(List<Integer> values) {\n            addCriterion(\"id in\", values, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotIn(List<Integer> values) {\n            addCriterion(\"id not in\", values, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdBetween(Integer value1, Integer value2) {\n            addCriterion(\"id between\", value1, value2, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotBetween(Integer value1, Integer value2) {\n            addCriterion(\"id not between\", value1, value2, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdIsNull() {\n            addCriterion(\"user_id is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdIsNotNull() {\n            addCriterion(\"user_id is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdEqualTo(Integer value) {\n            addCriterion(\"user_id =\", value, \"userId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdNotEqualTo(Integer value) {\n            addCriterion(\"user_id <>\", value, \"userId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdGreaterThan(Integer value) {\n            addCriterion(\"user_id >\", value, \"userId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdGreaterThanOrEqualTo(Integer value) {\n            addCriterion(\"user_id >=\", value, \"userId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdLessThan(Integer value) {\n            addCriterion(\"user_id <\", value, \"userId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdLessThanOrEqualTo(Integer value) {\n            addCriterion(\"user_id <=\", value, \"userId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdIn(List<Integer> values) {\n            addCriterion(\"user_id in\", values, \"userId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdNotIn(List<Integer> values) {\n            addCriterion(\"user_id not in\", values, \"userId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdBetween(Integer value1, Integer value2) {\n            addCriterion(\"user_id between\", value1, value2, \"userId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUserIdNotBetween(Integer value1, Integer value2) {\n            addCriterion(\"user_id not between\", value1, value2, \"userId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSexIsNull() {\n            addCriterion(\"sex is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSexIsNotNull() {\n            addCriterion(\"sex is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSexEqualTo(String value) {\n            addCriterion(\"sex =\", value, \"sex\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSexNotEqualTo(String value) {\n            addCriterion(\"sex <>\", value, \"sex\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSexGreaterThan(String value) {\n            addCriterion(\"sex >\", value, \"sex\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSexGreaterThanOrEqualTo(String value) {\n            addCriterion(\"sex >=\", value, \"sex\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSexLessThan(String value) {\n            addCriterion(\"sex <\", value, \"sex\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSexLessThanOrEqualTo(String value) {\n            addCriterion(\"sex <=\", value, \"sex\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSexLike(String value) {\n            addCriterion(\"sex like\", value, \"sex\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSexNotLike(String value) {\n            addCriterion(\"sex not like\", value, \"sex\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSexIn(List<String> values) {\n            addCriterion(\"sex in\", values, \"sex\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSexNotIn(List<String> values) {\n            addCriterion(\"sex not in\", values, \"sex\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSexBetween(String value1, String value2) {\n            addCriterion(\"sex between\", value1, value2, \"sex\");\n            return (Criteria) this;\n        }\n\n        public Criteria andSexNotBetween(String value1, String value2) {\n            addCriterion(\"sex not between\", value1, value2, \"sex\");\n            return (Criteria) this;\n        }\n\n        public Criteria andBirthdayIsNull() {\n            addCriterion(\"birthday is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andBirthdayIsNotNull() {\n            addCriterion(\"birthday is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andBirthdayEqualTo(Date value) {\n            addCriterionForJDBCDate(\"birthday =\", value, \"birthday\");\n            return (Criteria) this;\n        }\n\n        public Criteria andBirthdayNotEqualTo(Date value) {\n            addCriterionForJDBCDate(\"birthday <>\", value, \"birthday\");\n            return (Criteria) this;\n        }\n\n        public Criteria andBirthdayGreaterThan(Date value) {\n            addCriterionForJDBCDate(\"birthday >\", value, \"birthday\");\n            return (Criteria) this;\n        }\n\n        public Criteria andBirthdayGreaterThanOrEqualTo(Date value) {\n            addCriterionForJDBCDate(\"birthday >=\", value, \"birthday\");\n            return (Criteria) this;\n        }\n\n        public Criteria andBirthdayLessThan(Date value) {\n            addCriterionForJDBCDate(\"birthday <\", value, \"birthday\");\n            return (Criteria) this;\n        }\n\n        public Criteria andBirthdayLessThanOrEqualTo(Date value) {\n            addCriterionForJDBCDate(\"birthday <=\", value, \"birthday\");\n            return (Criteria) this;\n        }\n\n        public Criteria andBirthdayIn(List<Date> values) {\n            addCriterionForJDBCDate(\"birthday in\", values, \"birthday\");\n            return (Criteria) this;\n        }\n\n        public Criteria andBirthdayNotIn(List<Date> values) {\n            addCriterionForJDBCDate(\"birthday not in\", values, \"birthday\");\n            return (Criteria) this;\n        }\n\n        public Criteria andBirthdayBetween(Date value1, Date value2) {\n            addCriterionForJDBCDate(\"birthday between\", value1, value2, \"birthday\");\n            return (Criteria) this;\n        }\n\n        public Criteria andBirthdayNotBetween(Date value1, Date value2) {\n            addCriterionForJDBCDate(\"birthday not between\", value1, value2, \"birthday\");\n            return (Criteria) this;\n        }\n\n        public Criteria andAgeIsNull() {\n            addCriterion(\"age is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andAgeIsNotNull() {\n            addCriterion(\"age is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andAgeEqualTo(Integer value) {\n            addCriterion(\"age =\", value, \"age\");\n            return (Criteria) this;\n        }\n\n        public Criteria andAgeNotEqualTo(Integer value) {\n            addCriterion(\"age <>\", value, \"age\");\n            return (Criteria) this;\n        }\n\n        public Criteria andAgeGreaterThan(Integer value) {\n            addCriterion(\"age >\", value, \"age\");\n            return (Criteria) this;\n        }\n\n        public Criteria andAgeGreaterThanOrEqualTo(Integer value) {\n            addCriterion(\"age >=\", value, \"age\");\n            return (Criteria) this;\n        }\n\n        public Criteria andAgeLessThan(Integer value) {\n            addCriterion(\"age <\", value, \"age\");\n            return (Criteria) this;\n        }\n\n        public Criteria andAgeLessThanOrEqualTo(Integer value) {\n            addCriterion(\"age <=\", value, \"age\");\n            return (Criteria) this;\n        }\n\n        public Criteria andAgeIn(List<Integer> values) {\n            addCriterion(\"age in\", values, \"age\");\n            return (Criteria) this;\n        }\n\n        public Criteria andAgeNotIn(List<Integer> values) {\n            addCriterion(\"age not in\", values, \"age\");\n            return (Criteria) this;\n        }\n\n        public Criteria andAgeBetween(Integer value1, Integer value2) {\n            addCriterion(\"age between\", value1, value2, \"age\");\n            return (Criteria) this;\n        }\n\n        public Criteria andAgeNotBetween(Integer value1, Integer value2) {\n            addCriterion(\"age not between\", value1, value2, \"age\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdentityCardIsNull() {\n            addCriterion(\"identity_card is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdentityCardIsNotNull() {\n            addCriterion(\"identity_card is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdentityCardEqualTo(String value) {\n            addCriterion(\"identity_card =\", value, \"identityCard\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdentityCardNotEqualTo(String value) {\n            addCriterion(\"identity_card <>\", value, \"identityCard\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdentityCardGreaterThan(String value) {\n            addCriterion(\"identity_card >\", value, \"identityCard\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdentityCardGreaterThanOrEqualTo(String value) {\n            addCriterion(\"identity_card >=\", value, \"identityCard\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdentityCardLessThan(String value) {\n            addCriterion(\"identity_card <\", value, \"identityCard\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdentityCardLessThanOrEqualTo(String value) {\n            addCriterion(\"identity_card <=\", value, \"identityCard\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdentityCardLike(String value) {\n            addCriterion(\"identity_card like\", value, \"identityCard\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdentityCardNotLike(String value) {\n            addCriterion(\"identity_card not like\", value, \"identityCard\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdentityCardIn(List<String> values) {\n            addCriterion(\"identity_card in\", values, \"identityCard\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdentityCardNotIn(List<String> values) {\n            addCriterion(\"identity_card not in\", values, \"identityCard\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdentityCardBetween(String value1, String value2) {\n            addCriterion(\"identity_card between\", value1, value2, \"identityCard\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdentityCardNotBetween(String value1, String value2) {\n            addCriterion(\"identity_card not between\", value1, value2, \"identityCard\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEmailIsNull() {\n            addCriterion(\"email is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEmailIsNotNull() {\n            addCriterion(\"email is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEmailEqualTo(String value) {\n            addCriterion(\"email =\", value, \"email\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEmailNotEqualTo(String value) {\n            addCriterion(\"email <>\", value, \"email\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEmailGreaterThan(String value) {\n            addCriterion(\"email >\", value, \"email\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEmailGreaterThanOrEqualTo(String value) {\n            addCriterion(\"email >=\", value, \"email\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEmailLessThan(String value) {\n            addCriterion(\"email <\", value, \"email\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEmailLessThanOrEqualTo(String value) {\n            addCriterion(\"email <=\", value, \"email\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEmailLike(String value) {\n            addCriterion(\"email like\", value, \"email\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEmailNotLike(String value) {\n            addCriterion(\"email not like\", value, \"email\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEmailIn(List<String> values) {\n            addCriterion(\"email in\", values, \"email\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEmailNotIn(List<String> values) {\n            addCriterion(\"email not in\", values, \"email\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEmailBetween(String value1, String value2) {\n            addCriterion(\"email between\", value1, value2, \"email\");\n            return (Criteria) this;\n        }\n\n        public Criteria andEmailNotBetween(String value1, String value2) {\n            addCriterion(\"email not between\", value1, value2, \"email\");\n            return (Criteria) this;\n        }\n\n        public Criteria andQqIsNull() {\n            addCriterion(\"qq is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andQqIsNotNull() {\n            addCriterion(\"qq is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andQqEqualTo(Integer value) {\n            addCriterion(\"qq =\", value, \"qq\");\n            return (Criteria) this;\n        }\n\n        public Criteria andQqNotEqualTo(Integer value) {\n            addCriterion(\"qq <>\", value, \"qq\");\n            return (Criteria) this;\n        }\n\n        public Criteria andQqGreaterThan(Integer value) {\n            addCriterion(\"qq >\", value, \"qq\");\n            return (Criteria) this;\n        }\n\n        public Criteria andQqGreaterThanOrEqualTo(Integer value) {\n            addCriterion(\"qq >=\", value, \"qq\");\n            return (Criteria) this;\n        }\n\n        public Criteria andQqLessThan(Integer value) {\n            addCriterion(\"qq <\", value, \"qq\");\n            return (Criteria) this;\n        }\n\n        public Criteria andQqLessThanOrEqualTo(Integer value) {\n            addCriterion(\"qq <=\", value, \"qq\");\n            return (Criteria) this;\n        }\n\n        public Criteria andQqIn(List<Integer> values) {\n            addCriterion(\"qq in\", values, \"qq\");\n            return (Criteria) this;\n        }\n\n        public Criteria andQqNotIn(List<Integer> values) {\n            addCriterion(\"qq not in\", values, \"qq\");\n            return (Criteria) this;\n        }\n\n        public Criteria andQqBetween(Integer value1, Integer value2) {\n            addCriterion(\"qq between\", value1, value2, \"qq\");\n            return (Criteria) this;\n        }\n\n        public Criteria andQqNotBetween(Integer value1, Integer value2) {\n            addCriterion(\"qq not between\", value1, value2, \"qq\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWechatIsNull() {\n            addCriterion(\"wechat is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWechatIsNotNull() {\n            addCriterion(\"wechat is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWechatEqualTo(String value) {\n            addCriterion(\"wechat =\", value, \"wechat\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWechatNotEqualTo(String value) {\n            addCriterion(\"wechat <>\", value, \"wechat\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWechatGreaterThan(String value) {\n            addCriterion(\"wechat >\", value, \"wechat\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWechatGreaterThanOrEqualTo(String value) {\n            addCriterion(\"wechat >=\", value, \"wechat\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWechatLessThan(String value) {\n            addCriterion(\"wechat <\", value, \"wechat\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWechatLessThanOrEqualTo(String value) {\n            addCriterion(\"wechat <=\", value, \"wechat\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWechatLike(String value) {\n            addCriterion(\"wechat like\", value, \"wechat\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWechatNotLike(String value) {\n            addCriterion(\"wechat not like\", value, \"wechat\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWechatIn(List<String> values) {\n            addCriterion(\"wechat in\", values, \"wechat\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWechatNotIn(List<String> values) {\n            addCriterion(\"wechat not in\", values, \"wechat\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWechatBetween(String value1, String value2) {\n            addCriterion(\"wechat between\", value1, value2, \"wechat\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWechatNotBetween(String value1, String value2) {\n            addCriterion(\"wechat not between\", value1, value2, \"wechat\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWeiboIsNull() {\n            addCriterion(\"weibo is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWeiboIsNotNull() {\n            addCriterion(\"weibo is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWeiboEqualTo(String value) {\n            addCriterion(\"weibo =\", value, \"weibo\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWeiboNotEqualTo(String value) {\n            addCriterion(\"weibo <>\", value, \"weibo\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWeiboGreaterThan(String value) {\n            addCriterion(\"weibo >\", value, \"weibo\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWeiboGreaterThanOrEqualTo(String value) {\n            addCriterion(\"weibo >=\", value, \"weibo\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWeiboLessThan(String value) {\n            addCriterion(\"weibo <\", value, \"weibo\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWeiboLessThanOrEqualTo(String value) {\n            addCriterion(\"weibo <=\", value, \"weibo\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWeiboLike(String value) {\n            addCriterion(\"weibo like\", value, \"weibo\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWeiboNotLike(String value) {\n            addCriterion(\"weibo not like\", value, \"weibo\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWeiboIn(List<String> values) {\n            addCriterion(\"weibo in\", values, \"weibo\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWeiboNotIn(List<String> values) {\n            addCriterion(\"weibo not in\", values, \"weibo\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWeiboBetween(String value1, String value2) {\n            addCriterion(\"weibo between\", value1, value2, \"weibo\");\n            return (Criteria) this;\n        }\n\n        public Criteria andWeiboNotBetween(String value1, String value2) {\n            addCriterion(\"weibo not between\", value1, value2, \"weibo\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPhoneIsNull() {\n            addCriterion(\"phone is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPhoneIsNotNull() {\n            addCriterion(\"phone is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPhoneEqualTo(String value) {\n            addCriterion(\"phone =\", value, \"phone\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPhoneNotEqualTo(String value) {\n            addCriterion(\"phone <>\", value, \"phone\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPhoneGreaterThan(String value) {\n            addCriterion(\"phone >\", value, \"phone\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPhoneGreaterThanOrEqualTo(String value) {\n            addCriterion(\"phone >=\", value, \"phone\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPhoneLessThan(String value) {\n            addCriterion(\"phone <\", value, \"phone\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPhoneLessThanOrEqualTo(String value) {\n            addCriterion(\"phone <=\", value, \"phone\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPhoneLike(String value) {\n            addCriterion(\"phone like\", value, \"phone\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPhoneNotLike(String value) {\n            addCriterion(\"phone not like\", value, \"phone\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPhoneIn(List<String> values) {\n            addCriterion(\"phone in\", values, \"phone\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPhoneNotIn(List<String> values) {\n            addCriterion(\"phone not in\", values, \"phone\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPhoneBetween(String value1, String value2) {\n            addCriterion(\"phone between\", value1, value2, \"phone\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPhoneNotBetween(String value1, String value2) {\n            addCriterion(\"phone not between\", value1, value2, \"phone\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelIsNull() {\n            addCriterion(\"is_del is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelIsNotNull() {\n            addCriterion(\"is_del is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelEqualTo(String value) {\n            addCriterion(\"is_del =\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelNotEqualTo(String value) {\n            addCriterion(\"is_del <>\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelGreaterThan(String value) {\n            addCriterion(\"is_del >\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelGreaterThanOrEqualTo(String value) {\n            addCriterion(\"is_del >=\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelLessThan(String value) {\n            addCriterion(\"is_del <\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelLessThanOrEqualTo(String value) {\n            addCriterion(\"is_del <=\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelLike(String value) {\n            addCriterion(\"is_del like\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelNotLike(String value) {\n            addCriterion(\"is_del not like\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelIn(List<String> values) {\n            addCriterion(\"is_del in\", values, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelNotIn(List<String> values) {\n            addCriterion(\"is_del not in\", values, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelBetween(String value1, String value2) {\n            addCriterion(\"is_del between\", value1, value2, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelNotBetween(String value1, String value2) {\n            addCriterion(\"is_del not between\", value1, value2, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIsNull() {\n            addCriterion(\"create_time is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIsNotNull() {\n            addCriterion(\"create_time is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeEqualTo(Date value) {\n            addCriterion(\"create_time =\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotEqualTo(Date value) {\n            addCriterion(\"create_time <>\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeGreaterThan(Date value) {\n            addCriterion(\"create_time >\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {\n            addCriterion(\"create_time >=\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeLessThan(Date value) {\n            addCriterion(\"create_time <\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {\n            addCriterion(\"create_time <=\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIn(List<Date> values) {\n            addCriterion(\"create_time in\", values, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotIn(List<Date> values) {\n            addCriterion(\"create_time not in\", values, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeBetween(Date value1, Date value2) {\n            addCriterion(\"create_time between\", value1, value2, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {\n            addCriterion(\"create_time not between\", value1, value2, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIsNull() {\n            addCriterion(\"update_time is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIsNotNull() {\n            addCriterion(\"update_time is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeEqualTo(Date value) {\n            addCriterion(\"update_time =\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotEqualTo(Date value) {\n            addCriterion(\"update_time <>\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeGreaterThan(Date value) {\n            addCriterion(\"update_time >\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) {\n            addCriterion(\"update_time >=\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeLessThan(Date value) {\n            addCriterion(\"update_time <\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeLessThanOrEqualTo(Date value) {\n            addCriterion(\"update_time <=\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIn(List<Date> values) {\n            addCriterion(\"update_time in\", values, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotIn(List<Date> values) {\n            addCriterion(\"update_time not in\", values, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeBetween(Date value1, Date value2) {\n            addCriterion(\"update_time between\", value1, value2, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotBetween(Date value1, Date value2) {\n            addCriterion(\"update_time not between\", value1, value2, \"updateTime\");\n            return (Criteria) this;\n        }\n    }\n\n    /**\n     */\n    public static class Criteria extends GeneratedCriteria {\n\n        protected Criteria() {\n            super();\n        }\n    }\n\n    public static class Criterion {\n        private String condition;\n\n        private Object value;\n\n        private Object secondValue;\n\n        private boolean noValue;\n\n        private boolean singleValue;\n\n        private boolean betweenValue;\n\n        private boolean listValue;\n\n        private String typeHandler;\n\n        public String getCondition() {\n            return condition;\n        }\n\n        public Object getValue() {\n            return value;\n        }\n\n        public Object getSecondValue() {\n            return secondValue;\n        }\n\n        public boolean isNoValue() {\n            return noValue;\n        }\n\n        public boolean isSingleValue() {\n            return singleValue;\n        }\n\n        public boolean isBetweenValue() {\n            return betweenValue;\n        }\n\n        public boolean isListValue() {\n            return listValue;\n        }\n\n        public String getTypeHandler() {\n            return typeHandler;\n        }\n\n        protected Criterion(String condition) {\n            super();\n            this.condition = condition;\n            this.typeHandler = null;\n            this.noValue = true;\n        }\n\n        protected Criterion(String condition, Object value, String typeHandler) {\n            super();\n            this.condition = condition;\n            this.value = value;\n            this.typeHandler = typeHandler;\n            if (value instanceof List<?>) {\n                this.listValue = true;\n            } else {\n                this.singleValue = true;\n            }\n        }\n\n        protected Criterion(String condition, Object value) {\n            this(condition, value, null);\n        }\n\n        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {\n            super();\n            this.condition = condition;\n            this.value = value;\n            this.secondValue = secondValue;\n            this.typeHandler = typeHandler;\n            this.betweenValue = true;\n        }\n\n        protected Criterion(String condition, Object value, Object secondValue) {\n            this(condition, value, secondValue, null);\n        }\n    }\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/model/Users.java",
    "content": "package com.zmh.projectoa.model;\n\nimport java.io.Serializable;\nimport java.util.Date;\n\n/**\n * @author \n */\npublic class Users implements Serializable {\n    private Integer id;\n\n    private String username;\n\n    private String password;\n\n    private String realname;\n\n    private Integer departmentId;\n\n    private Integer positionId;\n\n    private String isDel;\n\n    private Date lastLoginTime;\n\n    private Date createTime;\n\n    private Date updateTime;\n\n    private static final long serialVersionUID = 1L;\n\n    public Integer getId() {\n        return id;\n    }\n\n    public void setId(Integer id) {\n        this.id = id;\n    }\n\n    public String getUsername() {\n        return username;\n    }\n\n    public void setUsername(String username) {\n        this.username = username;\n    }\n\n    public String getPassword() {\n        return password;\n    }\n\n    public void setPassword(String password) {\n        this.password = password;\n    }\n\n    public String getRealname() {\n        return realname;\n    }\n\n    public void setRealname(String realname) {\n        this.realname = realname;\n    }\n\n    public Integer getDepartmentId() {\n        return departmentId;\n    }\n\n    public void setDepartmentId(Integer departmentId) {\n        this.departmentId = departmentId;\n    }\n\n    public Integer getPositionId() {\n        return positionId;\n    }\n\n    public void setPositionId(Integer positionId) {\n        this.positionId = positionId;\n    }\n\n    public String getIsDel() {\n        return isDel;\n    }\n\n    public void setIsDel(String isDel) {\n        this.isDel = isDel;\n    }\n\n    public Date getLastLoginTime() {\n        return lastLoginTime;\n    }\n\n    public void setLastLoginTime(Date lastLoginTime) {\n        this.lastLoginTime = lastLoginTime;\n    }\n\n    public Date getCreateTime() {\n        return createTime;\n    }\n\n    public void setCreateTime(Date createTime) {\n        this.createTime = createTime;\n    }\n\n    public Date getUpdateTime() {\n        return updateTime;\n    }\n\n    public void setUpdateTime(Date updateTime) {\n        this.updateTime = updateTime;\n    }\n\n    @Override\n    public boolean equals(Object that) {\n        if (this == that) {\n            return true;\n        }\n        if (that == null) {\n            return false;\n        }\n        if (getClass() != that.getClass()) {\n            return false;\n        }\n        Users other = (Users) that;\n        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))\n            && (this.getUsername() == null ? other.getUsername() == null : this.getUsername().equals(other.getUsername()))\n            && (this.getPassword() == null ? other.getPassword() == null : this.getPassword().equals(other.getPassword()))\n            && (this.getRealname() == null ? other.getRealname() == null : this.getRealname().equals(other.getRealname()))\n            && (this.getDepartmentId() == null ? other.getDepartmentId() == null : this.getDepartmentId().equals(other.getDepartmentId()))\n            && (this.getPositionId() == null ? other.getPositionId() == null : this.getPositionId().equals(other.getPositionId()))\n            && (this.getIsDel() == null ? other.getIsDel() == null : this.getIsDel().equals(other.getIsDel()))\n            && (this.getLastLoginTime() == null ? other.getLastLoginTime() == null : this.getLastLoginTime().equals(other.getLastLoginTime()))\n            && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()))\n            && (this.getUpdateTime() == null ? other.getUpdateTime() == null : this.getUpdateTime().equals(other.getUpdateTime()));\n    }\n\n    @Override\n    public int hashCode() {\n        final int prime = 31;\n        int result = 1;\n        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());\n        result = prime * result + ((getUsername() == null) ? 0 : getUsername().hashCode());\n        result = prime * result + ((getPassword() == null) ? 0 : getPassword().hashCode());\n        result = prime * result + ((getRealname() == null) ? 0 : getRealname().hashCode());\n        result = prime * result + ((getDepartmentId() == null) ? 0 : getDepartmentId().hashCode());\n        result = prime * result + ((getPositionId() == null) ? 0 : getPositionId().hashCode());\n        result = prime * result + ((getIsDel() == null) ? 0 : getIsDel().hashCode());\n        result = prime * result + ((getLastLoginTime() == null) ? 0 : getLastLoginTime().hashCode());\n        result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().hashCode());\n        result = prime * result + ((getUpdateTime() == null) ? 0 : getUpdateTime().hashCode());\n        return result;\n    }\n\n    @Override\n    public String toString() {\n        StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [\");\n        sb.append(\"Hash = \").append(hashCode());\n        sb.append(\", id=\").append(id);\n        sb.append(\", username=\").append(username);\n        sb.append(\", password=\").append(password);\n        sb.append(\", realname=\").append(realname);\n        sb.append(\", departmentId=\").append(departmentId);\n        sb.append(\", positionId=\").append(positionId);\n        sb.append(\", isDel=\").append(isDel);\n        sb.append(\", lastLoginTime=\").append(lastLoginTime);\n        sb.append(\", createTime=\").append(createTime);\n        sb.append(\", updateTime=\").append(updateTime);\n        sb.append(\", serialVersionUID=\").append(serialVersionUID);\n        sb.append(\"]\");\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/model/UsersExample.java",
    "content": "package com.zmh.projectoa.model;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\n\npublic class UsersExample {\n    protected String orderByClause;\n\n    protected boolean distinct;\n\n    protected List<Criteria> oredCriteria;\n\n    private Integer limit;\n\n    private Integer offset;\n\n    public UsersExample() {\n        oredCriteria = new ArrayList<Criteria>();\n    }\n\n    public void setOrderByClause(String orderByClause) {\n        this.orderByClause = orderByClause;\n    }\n\n    public String getOrderByClause() {\n        return orderByClause;\n    }\n\n    public void setDistinct(boolean distinct) {\n        this.distinct = distinct;\n    }\n\n    public boolean isDistinct() {\n        return distinct;\n    }\n\n    public List<Criteria> getOredCriteria() {\n        return oredCriteria;\n    }\n\n    public void or(Criteria criteria) {\n        oredCriteria.add(criteria);\n    }\n\n    public Criteria or() {\n        Criteria criteria = createCriteriaInternal();\n        oredCriteria.add(criteria);\n        return criteria;\n    }\n\n    public Criteria createCriteria() {\n        Criteria criteria = createCriteriaInternal();\n        if (oredCriteria.size() == 0) {\n            oredCriteria.add(criteria);\n        }\n        return criteria;\n    }\n\n    protected Criteria createCriteriaInternal() {\n        Criteria criteria = new Criteria();\n        return criteria;\n    }\n\n    public void clear() {\n        oredCriteria.clear();\n        orderByClause = null;\n        distinct = false;\n    }\n\n    public void setLimit(Integer limit) {\n        this.limit = limit;\n    }\n\n    public Integer getLimit() {\n        return limit;\n    }\n\n    public void setOffset(Integer offset) {\n        this.offset = offset;\n    }\n\n    public Integer getOffset() {\n        return offset;\n    }\n\n    protected abstract static class GeneratedCriteria {\n        protected List<Criterion> criteria;\n\n        protected GeneratedCriteria() {\n            super();\n            criteria = new ArrayList<Criterion>();\n        }\n\n        public boolean isValid() {\n            return criteria.size() > 0;\n        }\n\n        public List<Criterion> getAllCriteria() {\n            return criteria;\n        }\n\n        public List<Criterion> getCriteria() {\n            return criteria;\n        }\n\n        protected void addCriterion(String condition) {\n            if (condition == null) {\n                throw new RuntimeException(\"Value for condition cannot be null\");\n            }\n            criteria.add(new Criterion(condition));\n        }\n\n        protected void addCriterion(String condition, Object value, String property) {\n            if (value == null) {\n                throw new RuntimeException(\"Value for \" + property + \" cannot be null\");\n            }\n            criteria.add(new Criterion(condition, value));\n        }\n\n        protected void addCriterion(String condition, Object value1, Object value2, String property) {\n            if (value1 == null || value2 == null) {\n                throw new RuntimeException(\"Between values for \" + property + \" cannot be null\");\n            }\n            criteria.add(new Criterion(condition, value1, value2));\n        }\n\n        public Criteria andIdIsNull() {\n            addCriterion(\"id is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdIsNotNull() {\n            addCriterion(\"id is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdEqualTo(Integer value) {\n            addCriterion(\"id =\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotEqualTo(Integer value) {\n            addCriterion(\"id <>\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdGreaterThan(Integer value) {\n            addCriterion(\"id >\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdGreaterThanOrEqualTo(Integer value) {\n            addCriterion(\"id >=\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdLessThan(Integer value) {\n            addCriterion(\"id <\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdLessThanOrEqualTo(Integer value) {\n            addCriterion(\"id <=\", value, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdIn(List<Integer> values) {\n            addCriterion(\"id in\", values, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotIn(List<Integer> values) {\n            addCriterion(\"id not in\", values, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdBetween(Integer value1, Integer value2) {\n            addCriterion(\"id between\", value1, value2, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIdNotBetween(Integer value1, Integer value2) {\n            addCriterion(\"id not between\", value1, value2, \"id\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUsernameIsNull() {\n            addCriterion(\"username is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUsernameIsNotNull() {\n            addCriterion(\"username is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUsernameEqualTo(String value) {\n            addCriterion(\"username =\", value, \"username\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUsernameNotEqualTo(String value) {\n            addCriterion(\"username <>\", value, \"username\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUsernameGreaterThan(String value) {\n            addCriterion(\"username >\", value, \"username\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUsernameGreaterThanOrEqualTo(String value) {\n            addCriterion(\"username >=\", value, \"username\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUsernameLessThan(String value) {\n            addCriterion(\"username <\", value, \"username\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUsernameLessThanOrEqualTo(String value) {\n            addCriterion(\"username <=\", value, \"username\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUsernameLike(String value) {\n            addCriterion(\"username like\", value, \"username\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUsernameNotLike(String value) {\n            addCriterion(\"username not like\", value, \"username\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUsernameIn(List<String> values) {\n            addCriterion(\"username in\", values, \"username\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUsernameNotIn(List<String> values) {\n            addCriterion(\"username not in\", values, \"username\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUsernameBetween(String value1, String value2) {\n            addCriterion(\"username between\", value1, value2, \"username\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUsernameNotBetween(String value1, String value2) {\n            addCriterion(\"username not between\", value1, value2, \"username\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPasswordIsNull() {\n            addCriterion(\"password is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPasswordIsNotNull() {\n            addCriterion(\"password is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPasswordEqualTo(String value) {\n            addCriterion(\"password =\", value, \"password\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPasswordNotEqualTo(String value) {\n            addCriterion(\"password <>\", value, \"password\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPasswordGreaterThan(String value) {\n            addCriterion(\"password >\", value, \"password\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPasswordGreaterThanOrEqualTo(String value) {\n            addCriterion(\"password >=\", value, \"password\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPasswordLessThan(String value) {\n            addCriterion(\"password <\", value, \"password\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPasswordLessThanOrEqualTo(String value) {\n            addCriterion(\"password <=\", value, \"password\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPasswordLike(String value) {\n            addCriterion(\"password like\", value, \"password\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPasswordNotLike(String value) {\n            addCriterion(\"password not like\", value, \"password\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPasswordIn(List<String> values) {\n            addCriterion(\"password in\", values, \"password\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPasswordNotIn(List<String> values) {\n            addCriterion(\"password not in\", values, \"password\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPasswordBetween(String value1, String value2) {\n            addCriterion(\"password between\", value1, value2, \"password\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPasswordNotBetween(String value1, String value2) {\n            addCriterion(\"password not between\", value1, value2, \"password\");\n            return (Criteria) this;\n        }\n\n        public Criteria andRealnameIsNull() {\n            addCriterion(\"realname is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andRealnameIsNotNull() {\n            addCriterion(\"realname is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andRealnameEqualTo(String value) {\n            addCriterion(\"realname =\", value, \"realname\");\n            return (Criteria) this;\n        }\n\n        public Criteria andRealnameNotEqualTo(String value) {\n            addCriterion(\"realname <>\", value, \"realname\");\n            return (Criteria) this;\n        }\n\n        public Criteria andRealnameGreaterThan(String value) {\n            addCriterion(\"realname >\", value, \"realname\");\n            return (Criteria) this;\n        }\n\n        public Criteria andRealnameGreaterThanOrEqualTo(String value) {\n            addCriterion(\"realname >=\", value, \"realname\");\n            return (Criteria) this;\n        }\n\n        public Criteria andRealnameLessThan(String value) {\n            addCriterion(\"realname <\", value, \"realname\");\n            return (Criteria) this;\n        }\n\n        public Criteria andRealnameLessThanOrEqualTo(String value) {\n            addCriterion(\"realname <=\", value, \"realname\");\n            return (Criteria) this;\n        }\n\n        public Criteria andRealnameLike(String value) {\n            addCriterion(\"realname like\", value, \"realname\");\n            return (Criteria) this;\n        }\n\n        public Criteria andRealnameNotLike(String value) {\n            addCriterion(\"realname not like\", value, \"realname\");\n            return (Criteria) this;\n        }\n\n        public Criteria andRealnameIn(List<String> values) {\n            addCriterion(\"realname in\", values, \"realname\");\n            return (Criteria) this;\n        }\n\n        public Criteria andRealnameNotIn(List<String> values) {\n            addCriterion(\"realname not in\", values, \"realname\");\n            return (Criteria) this;\n        }\n\n        public Criteria andRealnameBetween(String value1, String value2) {\n            addCriterion(\"realname between\", value1, value2, \"realname\");\n            return (Criteria) this;\n        }\n\n        public Criteria andRealnameNotBetween(String value1, String value2) {\n            addCriterion(\"realname not between\", value1, value2, \"realname\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentIdIsNull() {\n            addCriterion(\"department_id is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentIdIsNotNull() {\n            addCriterion(\"department_id is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentIdEqualTo(Integer value) {\n            addCriterion(\"department_id =\", value, \"departmentId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentIdNotEqualTo(Integer value) {\n            addCriterion(\"department_id <>\", value, \"departmentId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentIdGreaterThan(Integer value) {\n            addCriterion(\"department_id >\", value, \"departmentId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentIdGreaterThanOrEqualTo(Integer value) {\n            addCriterion(\"department_id >=\", value, \"departmentId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentIdLessThan(Integer value) {\n            addCriterion(\"department_id <\", value, \"departmentId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentIdLessThanOrEqualTo(Integer value) {\n            addCriterion(\"department_id <=\", value, \"departmentId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentIdIn(List<Integer> values) {\n            addCriterion(\"department_id in\", values, \"departmentId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentIdNotIn(List<Integer> values) {\n            addCriterion(\"department_id not in\", values, \"departmentId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentIdBetween(Integer value1, Integer value2) {\n            addCriterion(\"department_id between\", value1, value2, \"departmentId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andDepartmentIdNotBetween(Integer value1, Integer value2) {\n            addCriterion(\"department_id not between\", value1, value2, \"departmentId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionIdIsNull() {\n            addCriterion(\"position_id is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionIdIsNotNull() {\n            addCriterion(\"position_id is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionIdEqualTo(Integer value) {\n            addCriterion(\"position_id =\", value, \"positionId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionIdNotEqualTo(Integer value) {\n            addCriterion(\"position_id <>\", value, \"positionId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionIdGreaterThan(Integer value) {\n            addCriterion(\"position_id >\", value, \"positionId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionIdGreaterThanOrEqualTo(Integer value) {\n            addCriterion(\"position_id >=\", value, \"positionId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionIdLessThan(Integer value) {\n            addCriterion(\"position_id <\", value, \"positionId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionIdLessThanOrEqualTo(Integer value) {\n            addCriterion(\"position_id <=\", value, \"positionId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionIdIn(List<Integer> values) {\n            addCriterion(\"position_id in\", values, \"positionId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionIdNotIn(List<Integer> values) {\n            addCriterion(\"position_id not in\", values, \"positionId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionIdBetween(Integer value1, Integer value2) {\n            addCriterion(\"position_id between\", value1, value2, \"positionId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andPositionIdNotBetween(Integer value1, Integer value2) {\n            addCriterion(\"position_id not between\", value1, value2, \"positionId\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelIsNull() {\n            addCriterion(\"is_del is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelIsNotNull() {\n            addCriterion(\"is_del is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelEqualTo(String value) {\n            addCriterion(\"is_del =\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelNotEqualTo(String value) {\n            addCriterion(\"is_del <>\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelGreaterThan(String value) {\n            addCriterion(\"is_del >\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelGreaterThanOrEqualTo(String value) {\n            addCriterion(\"is_del >=\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelLessThan(String value) {\n            addCriterion(\"is_del <\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelLessThanOrEqualTo(String value) {\n            addCriterion(\"is_del <=\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelLike(String value) {\n            addCriterion(\"is_del like\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelNotLike(String value) {\n            addCriterion(\"is_del not like\", value, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelIn(List<String> values) {\n            addCriterion(\"is_del in\", values, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelNotIn(List<String> values) {\n            addCriterion(\"is_del not in\", values, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelBetween(String value1, String value2) {\n            addCriterion(\"is_del between\", value1, value2, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andIsDelNotBetween(String value1, String value2) {\n            addCriterion(\"is_del not between\", value1, value2, \"isDel\");\n            return (Criteria) this;\n        }\n\n        public Criteria andLastLoginTimeIsNull() {\n            addCriterion(\"last_login_time is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andLastLoginTimeIsNotNull() {\n            addCriterion(\"last_login_time is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andLastLoginTimeEqualTo(Date value) {\n            addCriterion(\"last_login_time =\", value, \"lastLoginTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andLastLoginTimeNotEqualTo(Date value) {\n            addCriterion(\"last_login_time <>\", value, \"lastLoginTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andLastLoginTimeGreaterThan(Date value) {\n            addCriterion(\"last_login_time >\", value, \"lastLoginTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andLastLoginTimeGreaterThanOrEqualTo(Date value) {\n            addCriterion(\"last_login_time >=\", value, \"lastLoginTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andLastLoginTimeLessThan(Date value) {\n            addCriterion(\"last_login_time <\", value, \"lastLoginTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andLastLoginTimeLessThanOrEqualTo(Date value) {\n            addCriterion(\"last_login_time <=\", value, \"lastLoginTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andLastLoginTimeIn(List<Date> values) {\n            addCriterion(\"last_login_time in\", values, \"lastLoginTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andLastLoginTimeNotIn(List<Date> values) {\n            addCriterion(\"last_login_time not in\", values, \"lastLoginTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andLastLoginTimeBetween(Date value1, Date value2) {\n            addCriterion(\"last_login_time between\", value1, value2, \"lastLoginTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andLastLoginTimeNotBetween(Date value1, Date value2) {\n            addCriterion(\"last_login_time not between\", value1, value2, \"lastLoginTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIsNull() {\n            addCriterion(\"create_time is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIsNotNull() {\n            addCriterion(\"create_time is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeEqualTo(Date value) {\n            addCriterion(\"create_time =\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotEqualTo(Date value) {\n            addCriterion(\"create_time <>\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeGreaterThan(Date value) {\n            addCriterion(\"create_time >\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {\n            addCriterion(\"create_time >=\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeLessThan(Date value) {\n            addCriterion(\"create_time <\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {\n            addCriterion(\"create_time <=\", value, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeIn(List<Date> values) {\n            addCriterion(\"create_time in\", values, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotIn(List<Date> values) {\n            addCriterion(\"create_time not in\", values, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeBetween(Date value1, Date value2) {\n            addCriterion(\"create_time between\", value1, value2, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {\n            addCriterion(\"create_time not between\", value1, value2, \"createTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIsNull() {\n            addCriterion(\"update_time is null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIsNotNull() {\n            addCriterion(\"update_time is not null\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeEqualTo(Date value) {\n            addCriterion(\"update_time =\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotEqualTo(Date value) {\n            addCriterion(\"update_time <>\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeGreaterThan(Date value) {\n            addCriterion(\"update_time >\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) {\n            addCriterion(\"update_time >=\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeLessThan(Date value) {\n            addCriterion(\"update_time <\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeLessThanOrEqualTo(Date value) {\n            addCriterion(\"update_time <=\", value, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeIn(List<Date> values) {\n            addCriterion(\"update_time in\", values, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotIn(List<Date> values) {\n            addCriterion(\"update_time not in\", values, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeBetween(Date value1, Date value2) {\n            addCriterion(\"update_time between\", value1, value2, \"updateTime\");\n            return (Criteria) this;\n        }\n\n        public Criteria andUpdateTimeNotBetween(Date value1, Date value2) {\n            addCriterion(\"update_time not between\", value1, value2, \"updateTime\");\n            return (Criteria) this;\n        }\n    }\n\n    /**\n     */\n    public static class Criteria extends GeneratedCriteria {\n\n        protected Criteria() {\n            super();\n        }\n    }\n\n    public static class Criterion {\n        private String condition;\n\n        private Object value;\n\n        private Object secondValue;\n\n        private boolean noValue;\n\n        private boolean singleValue;\n\n        private boolean betweenValue;\n\n        private boolean listValue;\n\n        private String typeHandler;\n\n        public String getCondition() {\n            return condition;\n        }\n\n        public Object getValue() {\n            return value;\n        }\n\n        public Object getSecondValue() {\n            return secondValue;\n        }\n\n        public boolean isNoValue() {\n            return noValue;\n        }\n\n        public boolean isSingleValue() {\n            return singleValue;\n        }\n\n        public boolean isBetweenValue() {\n            return betweenValue;\n        }\n\n        public boolean isListValue() {\n            return listValue;\n        }\n\n        public String getTypeHandler() {\n            return typeHandler;\n        }\n\n        protected Criterion(String condition) {\n            super();\n            this.condition = condition;\n            this.typeHandler = null;\n            this.noValue = true;\n        }\n\n        protected Criterion(String condition, Object value, String typeHandler) {\n            super();\n            this.condition = condition;\n            this.value = value;\n            this.typeHandler = typeHandler;\n            if (value instanceof List<?>) {\n                this.listValue = true;\n            } else {\n                this.singleValue = true;\n            }\n        }\n\n        protected Criterion(String condition, Object value) {\n            this(condition, value, null);\n        }\n\n        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {\n            super();\n            this.condition = condition;\n            this.value = value;\n            this.secondValue = secondValue;\n            this.typeHandler = typeHandler;\n            this.betweenValue = true;\n        }\n\n        protected Criterion(String condition, Object value, Object secondValue) {\n            this(condition, value, secondValue, null);\n        }\n    }\n}"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/service/DepartmentService.java",
    "content": "package com.zmh.projectoa.service;\n\nimport com.zmh.projectoa.mapper.DepartmentsMapper;\nimport com.zmh.projectoa.model.Departments;\nimport com.zmh.projectoa.model.DepartmentsExample;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\n\n/**\n * Created by ChengShanyunduo\n * 2018/2/14\n */\n@Service\npublic class DepartmentService {\n    @Autowired\n    DepartmentsMapper departmentsMapper;\n\n    /**\n     * 查询部门\n     * @return\n     */\n    public List<Departments> queryDepartment(){\n        DepartmentsExample departmentsExample = new DepartmentsExample();\n        return departmentsMapper.selectByExample(departmentsExample);\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/service/MessageService.java",
    "content": "package com.zmh.projectoa.service;\n\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.zmh.projectoa.mapper.MessagesMapper;\nimport com.zmh.projectoa.model.Messages;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @author zmh\n * @date 2018/2/2621:58\n */\n@Service\npublic class MessageService {\n    @Autowired\n    private MessagesMapper messagesMapper;\n\n    public int insertMessage(Messages messages) {\n        messagesMapper.insertSelective(messages);\n        return messages.getId();\n    }\n    /**\n     * 传入未读ID数组 返回未读信息 (Redis里含有的ID再Mysql中)\n     */\n    public List<Map<String,String>> selectByIDs(List<Integer> IDs){\n        return messagesMapper.selectByIDs(IDs);\n    }\n\n    /**\n     * 传入接受者ID 返回所有此人的信息 (Mysql中)\n     */\n    public PageInfo selectByreceiveID(Integer ID, Integer pageNum){\n        PageHelper.startPage(pageNum, 10);\n        List<Map<String, String>> list = messagesMapper.selectByreceiveID(ID);\n        PageInfo pageInfo = new PageInfo(list);\n        return pageInfo;\n    }\n\n    public Messages selectByID(Integer id){\n        return messagesMapper.selectByPrimaryKey(id);\n    }\n\n    public List<Map<String,String>> getLastMessage(Integer receiveID){\n        return messagesMapper.selectLastOneByReceiveID(receiveID);\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/service/NoticeService.java",
    "content": "package com.zmh.projectoa.service;\n\n\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.zmh.projectoa.mapper.NoticesMapper;\nimport com.zmh.projectoa.model.Notices;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @author zmh\n * @date 2018/2/2621:58\n */\n@Service\npublic class NoticeService {\n    @Autowired\n    private NoticesMapper noticesMapper;\n\n    public int insertNotice(Notices notices){\n        noticesMapper.insertSelective(notices);\n        return notices.getId();\n    }\n\n    /**\n     * 获取具体某条公告\n     */\n    public Notices getNotice(Integer noticeID){\n        return noticesMapper.selectByPrimaryKey(noticeID);\n    }\n\n    /**\n     * 获取本人所有公告\n     * 这个功能不分人 大家都收到一样\n     */\n    public PageInfo getAllNotices(Integer pageNum){\n        PageHelper.startPage(pageNum, 10);\n        List<Map<String, String>> result = noticesMapper.selectAllNotice();\n        PageInfo pageInfo = new PageInfo(result);\n        return pageInfo;\n    }\n\n    /**\n     * 传入未读ID数组 返回未读信息 (Redis里含有的ID再Mysql中)\n     */\n    public List<Map<String,String>> selectByIDs(List<Integer> IDs){\n        return noticesMapper.selectByIDs(IDs);\n    }\n\n    public Notices selectByID(Integer id){\n        return noticesMapper.selectByPrimaryKey(id);\n    }\n\n    public List<Map<String,String>> getLastNotice(){\n        return noticesMapper.selectLastOneByReceiveID();\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/service/PositionService.java",
    "content": "package com.zmh.projectoa.service;\n\nimport com.zmh.projectoa.mapper.PositionsMapper;\nimport com.zmh.projectoa.model.Positions;\nimport com.zmh.projectoa.model.PositionsExample;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.util.List;\n\n/**\n * Created by ChengShanyunduo\n * 2018/2/14\n */\n@Service\npublic class PositionService {\n\n    @Autowired\n    PositionsMapper positionsMapper;\n\n    /**\n     * 查询职位\n     * @return\n     */\n    public List<Positions> queryPosition(){\n        PositionsExample positionsExample = new PositionsExample();\n        List<Positions> positions = positionsMapper.selectByExample(positionsExample);\n        return positions;\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/service/RedisService.java",
    "content": "package com.zmh.projectoa.service;\n\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.redis.core.StringRedisTemplate;\nimport org.springframework.stereotype.Service;\n\n\n/**\n * @author zmh\n * @date 2018/2/1813:42\n * Spring Data Redis 的基本款\n * 只要Gradle或Maven引入依赖 就可以如此使用Redis 作为缓存\n */\n@Service\npublic class RedisService {\n    @Autowired\n    private StringRedisTemplate redisTemplate;\n\n    public void setValue(String key, String value) {\n        redisTemplate.opsForValue().set(key, value);\n    }\n\n    public String getValue(String key) {\n        return redisTemplate.opsForValue().get(key);\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/service/UserinfoService.java",
    "content": "package com.zmh.projectoa.service;\n\nimport com.zmh.projectoa.mapper.UserinfoMapper;\nimport com.zmh.projectoa.model.Userinfo;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\n/**\n * Created by ChengShanyunduo\n * 2018/2/25\n */\n@Service\npublic class UserinfoService {\n    @Autowired\n    UserinfoMapper userinfoMapper;\n\n    public Userinfo getUserinfoByUserId(Integer id){\n        Userinfo userinfo = userinfoMapper.queryUserinfoByUserid(id);\n        return userinfo;\n    }\n\n    public int saveUserinfo(Userinfo userinfo){\n        Integer id = userinfoMapper.queryUserinfoByUserid(userinfo.getUserId()).getId();\n        userinfo.setId(id);\n        int result = userinfoMapper.updateByPrimaryKeySelective(userinfo);\n        return result;\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/service/UsersService.java",
    "content": "package com.zmh.projectoa.service;\n\nimport com.github.pagehelper.Page;\nimport com.github.pagehelper.PageHelper;\nimport com.github.pagehelper.PageInfo;\nimport com.zmh.projectoa.dto.ReturnDto;\nimport com.zmh.projectoa.mapper.UserinfoMapper;\nimport com.zmh.projectoa.mapper.UsersMapper;\nimport com.zmh.projectoa.model.Userinfo;\nimport com.zmh.projectoa.model.Users;\nimport com.zmh.projectoa.model.UsersExample;\nimport com.zmh.projectoa.util.MD5Util;\nimport org.omg.CORBA.UserException;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.autoconfigure.security.oauth2.resource.UserInfoRestTemplateCustomizer;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport java.util.List;\nimport java.util.Map;\n\n\n/**\n * Created by ChengShanyunduo\n * 2018/2/14\n */\n@Service\npublic class UsersService {\n\n    @Autowired\n    UsersMapper usersMapper;\n\n    @Autowired\n    UserinfoMapper userinfoMapper;\n\n    /**\n     * 创建职工\n     * @param users\n     * @return\n     */\n    public int createUser(Users users){\n        String password = MD5Util.string2MD5(\"123456\");\n        users.setPassword(password);\n\n        int count = usersMapper.insertSelective(users);\n\n        if (count != 1){\n            return 0;\n        }\n\n        UsersExample usersExample = new UsersExample();\n        usersExample.createCriteria().andUsernameEqualTo(users.getUsername());\n        Users user = queryUserByUsername(users);\n\n        Userinfo userinfo = new Userinfo();\n        userinfo.setUserId(user.getId());\n\n        count = userinfoMapper.insertSelective(userinfo);\n\n        return count;\n    }\n\n    /**\n     * 根据用户名查找用户\n     * @param users\n     * @return\n     */\n    public Users queryUserByUsername(Users users){\n        return usersMapper.queryUserByUsername(users.getUsername());\n    }\n\n    /**\n     * 分页查询\n     * @param userDto\n     * @return\n     */\n    public PageInfo userList(Map<String, Object> map, Integer pageNum){\n\n        map.put(\"isDel\", \"0\");\n\n        PageHelper.startPage(pageNum, 10);\n        List<Users> list = usersMapper.queryBySelective(map);\n        PageInfo page = new PageInfo(list);\n\n        return page;\n    }\n\n    /**\n     * 用户回显\n     * @param id\n     * @return\n     */\n    public Users detailUser(Integer id){\n        Users user = usersMapper.selectByPrimaryKey(id);\n        return user;\n    }\n\n    /**\n     * 修改用户\n     * @param id\n     * @param user\n     * @return\n     */\n    public int editUser(Integer id, Users user){\n        user.setUsername(null);\n        user.setId(id);\n        int result = usersMapper.updateByPrimaryKeySelective(user);\n        return result;\n    }\n\n    /**\n     * 删除用户\n     * @param id\n     * @return\n     */\n    public int deleteUser(Integer id){\n        Users user = new Users();\n        user.setId(id);\n        user.setIsDel(\"1\");\n\n        Userinfo userinfo = userinfoMapper.queryUserinfoByUserid(id);\n        userinfo.setIsDel(\"1\");\n        int result = usersMapper.updateByPrimaryKeySelective(user);\n        int result2 = userinfoMapper.updateByPrimaryKeySelective(userinfo);\n        if (result == 1 && result2 == 1){\n            return 1;\n        }\n        return 0;\n    }\n\n    /**\n     * 重置密码\n     * @param id\n     * @return\n     */\n    public int reverseUser(Integer id){\n        Users user = new Users();\n        user.setId(id);\n        String password = MD5Util.string2MD5(\"123456\");\n        user.setPassword(password);\n\n        int result = usersMapper.updateByPrimaryKeySelective(user);\n\n        return result;\n    }\n\n\n    /**\n     * 取所有用户 下拉框使用\n     * @return\n     */\n    public ReturnDto getAllUser(Integer id){\n        List<Map<String,String>> list = usersMapper.queryAll(id);\n        return ReturnDto.buildSuccessReturnDto(list);\n    }\n\n    public List<Users> getAllUsers(){\n        return usersMapper.queryAllUsers();\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/util/JSONUtil.java",
    "content": "package com.zmh.projectoa.util;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class JSONUtil {\n\n    /**\n     * 传入Redis里未读ID的String 返回List\n     * 默认格式 1,2,3,4\n     */\n    public static List<Integer> String2List(String string) {\n        List<Integer> list = new ArrayList<>();\n        if (string != null && !\"\".equals(string))\n            for (String temp : string.split(\",\")) {\n                if (temp != null && !\"\".equals(temp))\n                    list.add(Integer.parseInt(temp));\n            }\n        return list;\n    }\n\n    /**\n     * 传入Redis里未读ID的String 返回List\n     */\n    public static String List2String(List<Integer> list) {\n        StringBuffer sb = new StringBuffer();\n        for (int i = 0; i < list.size(); i++) {\n            Integer integer = list.get(i);\n            sb.append(integer);\n            if (i != list.size() - 1)\n                sb.append(\",\");\n        }\n        return sb.toString();\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/util/MD5Util.java",
    "content": "package com.zmh.projectoa.util;\n\nimport java.security.MessageDigest;\n\n/**\n * Created by ChengShanyunduo\n * 2018/1/3\n */\npublic class MD5Util {\n\n    /***\n     * MD5加码 生成32位md5码\n     */\n    public static String string2MD5(String inStr){\n        MessageDigest md5 = null;\n        try{\n            md5 = MessageDigest.getInstance(\"MD5\");\n        }catch (Exception e){\n            System.out.println(e.toString());\n            e.printStackTrace();\n            return \"\";\n        }\n        char[] charArray = inStr.toCharArray();\n        byte[] byteArray = new byte[charArray.length];\n\n        for (int i = 0; i < charArray.length; i++)\n            byteArray[i] = (byte) charArray[i];\n        byte[] md5Bytes = md5.digest(byteArray);\n        StringBuffer hexValue = new StringBuffer();\n        for (int i = 0; i < md5Bytes.length; i++){\n            int val = ((int) md5Bytes[i]) & 0xff;\n            if (val < 16)\n                hexValue.append(\"0\");\n            hexValue.append(Integer.toHexString(val));\n        }\n        return hexValue.toString();\n\n    }\n\n    /**\n     * 加密解密算法 执行一次加密，两次解密\n     */\n//    public static String convertMD5(String inStr){\n//\n//        char[] a = inStr.toCharArray();\n//        for (int i = 0; i < a.length; i++){\n//            a[i] = (char) (a[i] ^ 't');\n//        }\n//        String s = new String(a);\n//        return s;\n//\n//    }\n\n//    // 测试主函数\n//    public static void main(String args[]) {\n//        String s = new String(\"duo521\");\n//        System.out.println(\"原始：\" + s);\n//        System.out.println(\"MD5后：\" + string2MD5(s));\n//        System.out.println(\"加密的：\" + convertMD5(s));\n//        System.out.println(\"解密的：\" + convertMD5(convertMD5(s)));\n//\n//    }\n\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/util/ParameterUtil.java",
    "content": "package com.zmh.projectoa.util;\n\nimport javax.servlet.http.HttpServletRequest;\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.Map;\n\n/**\n * Created by ChengShanyunduo\n * 2018/3/2\n */\npublic class ParameterUtil {\n\n    @SuppressWarnings(\"unchecked\")\n    public static Map getParameterMap(HttpServletRequest request) {\n        // 参数Map\n        Map properties = request.getParameterMap();\n        // 返回值Map\n        Map returnMap = new HashMap();\n        Iterator entries = properties.entrySet().iterator();\n        Map.Entry entry;\n        String name = \"\";\n        String value = \"\";\n        while (entries.hasNext()) {\n            entry = (Map.Entry) entries.next();\n            name = (String) entry.getKey();\n            Object valueObj = entry.getValue();\n            if(null == valueObj){\n                value = \"\";\n            }else if(valueObj instanceof String[]){\n                String[] values = (String[])valueObj;\n                for(int i=0;i<values.length;i++){\n                    value = values[i] + \",\";\n                }\n                value = value.substring(0, value.length()-1);\n            }else{\n                value = valueObj.toString();\n            }\n            returnMap.put(name, value);\n        }\n        return returnMap;\n    }\n}\n"
  },
  {
    "path": "src/main/java/com/zmh/projectoa/util/ReadFileUtil.java",
    "content": "package com.zmh.projectoa.util;\n\nimport com.zmh.projectoa.dto.ReturnDto;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport java.io.*;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * @author zmh\n * @date 2018/2/1813:42\n */\npublic class ReadFileUtil {\n    /**\n     * 获取文件夹下的文件名\n     *\n     * @param filePath 文件夹全路径\n     * @return 文件名的集合\n     */\n    public static ReturnDto getFileName(String filePath) {\n        List<String> list = new ArrayList<>();\n        try {\n            File file = new File(filePath);\n            File[] files = file.listFiles();\n            for (File f : files) {\n                if (f.isFile()) {\n                    list.add(f.getName());\n                }\n            }\n        } catch (Exception e) {\n            ReturnDto.buildFailedReturnDto(e.getMessage());\n        }\n        return ReturnDto.buildSuccessReturnDto(list);\n    }\n\n    /**\n     * 传入文件全路径 读取文件内容\n     *\n     * @param filePath 文件全路径\n     * @return 文件内容\n     */\n    public static ReturnDto readFileByLines(String filePath, String fileName, String charSet) {\n        StringBuffer sb = new StringBuffer();\n        try {\n            File file = new File(filePath + \"/\" + fileName);\n            BufferedReader reader=new BufferedReader(new InputStreamReader\n                    (new FileInputStream(file),charSet));\n            String tempString = null;\n            while ((tempString = reader.readLine()) != null) {\n                sb.append(tempString + \"\\r\\n\");\n            }\n            reader.close();\n        } catch (IOException e) {\n            ReturnDto.buildFailedReturnDto(e.getMessage());\n        }\n        return ReturnDto.buildSuccessReturnDto(sb.toString());\n    }\n}\n"
  },
  {
    "path": "src/main/resources/application.properties",
    "content": "# server\nserver.port=8080\nserver.context-path=/projectoa/\nspring.application.name=projectoa\n\n# thymeleaf\nspring.thymeleaf.prefix=classpath:/templates/view/\nspring.thymeleaf.suffix=.html\n# \\u914D\\u5408\\u70ED\\u90E8\\u7F72\nspring.thymeleaf.cache=false\n# \\u53CB\\u597D\\u7684HTML5\\u6807\\u51C6\nspring.thymeleaf.mode=LEGACYHTML5\n\n# mysql\nspring.datasource.driver-class-name=com.mysql.jdbc.Driver\nspring.datasource.url=jdbc:mysql://localhost:3306/dboa?useSSL=false&useUnicode=true&characterEncoding=utf8&autoReconnect=true\nspring.datasource.username=root\nspring.datasource.password=root\n\n# mybatis\nmybatis.mapper-locations=classpath:/templates/mapper/*Mapper.xml\nmybatis.type-aliases-package=com.zmh.projectoa.model\n\n# \\u81EA\\u52A8\\u8F6C\\u6362\\u6210\\u9A7C\\u5CF0\nmybatis.configuration.map-underscore-to-camel-case=true\n\n# \\u70ED\\u90E8\\u7F72\nspring.devtools.livereload.enabled=true\n\n# redis\\u5168\\u5BB6\\u6876\nspring.redis.host=127.0.0.1\nspring.redis.port=6379\n# \\u540C\\u65F6\\u6700\\u5927\\u8FDE\\u63A5\\u6570\nspring.redis.pool.max-active=64\n# \\u6700\\u5927\\u7A7A\\u95F2\\u8FDE\\u63A5\\u6570\nspring.redis.pool.max-idle=8\n# \\u6700\\u5927\\u83B7\\u53D6\\u7B49\\u5F85\\u65F6\\u95F4\nspring.redis.pool.max-wait=5000\n\n## spring boot admin \\u76D1\\u63A7\\u7AEF\nspring.boot.admin.context-path=/monitor\n# \\u4E0A\\u7EBF\\u9700\\u8981\\u6253\\u5F00\\u8FD9\\u4E2A\nspring.boot.admin.client.service-base-url=http://localhost:${server.port}/\n## spring boot admin \\u88AB\\u76D1\\u63A7\\u7AEF\nspring.boot.admin.client.prefer-ip=true\nspring.boot.admin.url=http://localhost:${server.port}/${spring.application.name}\nmanagement.security.enabled=false\n\n# \\u76D1\\u63A7\\u9875\\u9762\\u7684\\u4FE1\\u606F \\u7531\\u4E8E\\u6CA1\\u6709maven\\u5DE5\\u5177\\uFF0C\\u8FD9\\u91CC\\u9009\\u62E9\\u624B\\u52A8\\u8F93\\u5165\ninfo.app.name:projectoa\ninfo.app.description:graduation project\ninfo.app.version:0.0.1\ninfo.app.spring-boot-version:1.5.10\n\n# LOG\\u751F\\u6210\\u7684\\u4F4D\\u7F6E(\\u4E0D\\u662F\\u81EA\\u5E26\\u7684\\uFF0C\\u662F\\u6211\\u81EA\\u5DF1\\u52A0\\u7684\\uFF0C\\u5728xml\\u91CC\\u8C03\\u7528\\uFF0C\\u53E6\\u5916\\u5FC5\\u987B\\u53CD\\u659C\\u6760\\u6216\\u8005\\u53CC\\u659C\\u6760)\n#logback.filepath=C:/logs\n# aliyun\\u670D\\u52A1\\u5668\\u7528\\u8FD9\\u4E2A\nlogback.filepath=/root/logs\n#logback.filepath=/Users/chengshanyunduo/Documents/log\n# \\u8BFB\\u53D6\\u65E5\\u5FD7\\u6587\\u4EF6\\u65F6\\u5019\\u7528\\u7684\\u7F16\\u7801\\uFF0C\\u5EFA\\u8BAEUTF-8\nlogback.charset=UTF-8\n\n#json\\u8FD4\\u56DE\\u65E5\\u671F\\u683C\\u5F0F\nspring.jackson.date-format=yyyy-MM-dd HH:mm:ss\nspring.jackson.time-zone=GMT+8"
  },
  {
    "path": "src/main/resources/banner.txt",
    "content": "2018-03-05 该项目是由 程衫耘朵 和 张明辉 共同完成！\nhttps://github.com/chsyd1028\nhttps://github.com/18121259693\n"
  },
  {
    "path": "src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration debug=\"false\">\n    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->\n    <property resource=\"application.properties\" />\n    <!-- 控制台输出 -->\n    <appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n        <encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n            <!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度%msg：日志消息，%n是换行符-->\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>\n        </encoder>\n    </appender>\n    <!-- 按照每天生成日志文件 -->\n    <appender name=\"FILE\"  class=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n        <rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n            <!--日志文件输出的文件名 ${logback.filepath}是从application.properties里面取的-->\n            <FileNamePattern>${logback.filepath}/projectoa.%d{yyyyMMdd}.log</FileNamePattern>\n            <!--日志文件保留天数-->\n            <MaxHistory>30</MaxHistory>\n        </rollingPolicy>\n        <encoder class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\">\n            <!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度%msg：日志消息，%n是换行符-->\n            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>\n        </encoder>\n        <!--日志文件最大的大小-->\n        <triggeringPolicy class=\"ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy\">\n            <MaxFileSize>10MB</MaxFileSize>\n        </triggeringPolicy>\n    </appender>\n    <!--myibatis log configure-->\n    <logger name=\"com.apache.ibatis\" level=\"TRACE\"/>\n    <logger name=\"java.sql.Connection\" level=\"DEBUG\"/>\n    <logger name=\"java.sql.Statement\" level=\"DEBUG\"/>\n    <logger name=\"java.sql.PreparedStatement\" level=\"DEBUG\"/>\n\n    <!-- 日志输出级别 默认WARN -->\n    <root level=\"WARN\">\n        <appender-ref ref=\"STDOUT\" />\n        <appender-ref ref=\"FILE\" />\n    </root>\n    <!--日志异步到数据库 -->\n    <!--<appender name=\"DB\" class=\"ch.qos.logback.classic.db.DBAppender\">-->\n    <!--&lt;!&ndash;日志异步到数据库 &ndash;&gt;-->\n    <!--<connectionSource class=\"ch.qos.logback.core.db.DriverManagerConnectionSource\">-->\n    <!--&lt;!&ndash;连接池 &ndash;&gt;-->\n    <!--<dataSource class=\"com.mchange.v2.c3p0.ComboPooledDataSource\">-->\n    <!--<driverClass>com.mysql.jdbc.Driver</driverClass>-->\n    <!--<url>jdbc:mysql://127.0.0.1:3306/databaseName</url>-->\n    <!--<user>root</user>-->\n    <!--<password>root</password>-->\n    <!--</dataSource>-->\n    <!--</connectionSource>-->\n    <!--</appender>-->\n</configuration>"
  },
  {
    "path": "src/main/resources/public/error/404.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>OA系统</title>\n    <meta name=\"description\" content=\"这是一个 index 页面\">\n    <meta name=\"keywords\" content=\"index\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"renderer\" content=\"webkit\">\n    <meta http-equiv=\"Cache-Control\" content=\"no-siteapp\"/>\n    <link rel=\"icon\" type=\"image/png\" href=\"assets/i/favicon.png\">\n    <link rel=\"apple-touch-icon-precomposed\" href=\"assets/i/app-icon72x72@2x.png\">\n    <meta name=\"apple-mobile-web-app-title\" content=\"Amaze UI\"/>\n    <script src=\"assets/js/echarts.min.js\"></script>\n    <link rel=\"stylesheet\" href=\"assets/css/amazeui.min.css\"/>\n    <link rel=\"stylesheet\" href=\"assets/css/amazeui.datatables.min.css\"/>\n    <link rel=\"stylesheet\" href=\"assets/css/app.css\">\n    <script src=\"assets/js/jquery.min.js\"></script>\n\n</head>\n<body data-type=\"widgets\">\n<script src=\"assets/js/theme.js\"></script>\n<!-- 内容区域 -->\n<div class=\"row-content am-cf\">\n    <div class=\"widget am-cf\">\n        <div class=\"widget-body\">\n            <div class=\"tpl-page-state\">\n                <div class=\"tpl-page-state-title am-text-center tpl-error-title\">404</div>\n                <div class=\"tpl-error-title-info\">Page Not Found</div>\n                <div class=\"tpl-page-state-content tpl-error-content\">\n                    <p>您所访问的页面可能出现了一些异常情况，请与系统管理员联系。</p>\n                    <button type=\"button\" class=\"am-btn am-btn-secondary am-radius tpl-error-btn\"\n                            onclick=\"javascrtpt:window.location.href='/projectoa/index'\">回到首页\n                    </button>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n<script src=\"assets/js/amazeui.min.js\"></script>\n<script src=\"assets/js/amazeui.datatables.min.js\"></script>\n<script src=\"assets/js/dataTables.responsive.min.js\"></script>\n<script src=\"assets/js/app.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "src/main/resources/static/assets/css/admin.css",
    "content": "/**\n * admin.css\n */\n\n\n/*\n fixed-layout 固定头部和边栏布局\n*/\n\nhtml,\nbody {\n  height: 100%;\n  overflow: hidden;\n}\n\nul {\n  margin-top: 0;\n}\n\n.admin-icon-yellow {\n  color: #ffbe40;\n}\n\n.admin-header {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  z-index: 1500;\n  font-size: 1.4rem;\n  margin-bottom: 0;\n}\n\n.admin-header-list a:hover :after {\n  content: none;\n}\n\n.admin-main {\n  position: relative;\n  height: 100%;\n  padding-top: 51px;\n  background: #f3f3f3;\n}\n\n.admin-menu {\n  position: fixed;\n  z-index: 10;\n  bottom: 30px;\n  right: 20px;\n}\n\n.admin-sidebar {\n  width: 260px;\n  min-height: 100%;\n  float: left;\n  border-right: 1px solid #cecece;\n}\n\n.admin-sidebar.am-active {\n  z-index: 1600;\n}\n\n.admin-sidebar-list {\n  margin-bottom: 0;\n}\n\n.admin-sidebar-list li a {\n  color: #5c5c5c;\n  padding-left: 24px;\n}\n\n.admin-sidebar-list li:first-child {\n  border-top: none;\n}\n\n.admin-sidebar-sub {\n  margin-top: 0;\n  margin-bottom: 0;\n  box-shadow: 0 16px 8px -15px #e2e2e2 inset;\n  background: #ececec;\n  padding-left: 24px;\n}\n\n.admin-sidebar-sub li:first-child {\n  border-top: 1px solid #dedede;\n}\n\n.admin-sidebar-panel {\n  margin: 10px;\n}\n\n.admin-content {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  background: #fff;\n}\n\n.admin-content,\n.admin-sidebar {\n  height: 100%;\n  overflow-x: hidden;\n  overflow-y: scroll;\n  -webkit-overflow-scrolling: touch;\n}\n\n.admin-content-body {\n  -webkit-box-flex: 1;\n  -webkit-flex: 1 0 auto;\n  -ms-flex: 1 0 auto;\n  flex: 1 0 auto;\n}\n\n.admin-content-footer {\n  font-size: 85%;\n  color: #777;\n}\n\n.admin-content-list {\n  border: 1px solid #e9ecf1;\n  margin-top: 0;\n}\n\n.admin-content-list li {\n  border: 1px solid #e9ecf1;\n  border-width: 0 1px;\n  margin-left: -1px;\n}\n\n.admin-content-list li:first-child {\n  border-left: none;\n}\n\n.admin-content-list li:last-child {\n  border-right: none;\n}\n\n.admin-content-table a {\n  color: #535353;\n}\n.admin-content-file {\n  margin-bottom: 0;\n  color: #666;\n}\n\n.admin-content-file p {\n  margin: 0 0 5px 0;\n  font-size: 1.4rem;\n}\n\n.admin-content-file li {\n  padding: 10px 0;\n}\n\n.admin-content-file li:first-child {\n  border-top: none;\n}\n\n.admin-content-file li:last-child {\n  border-bottom: none;\n}\n\n.admin-content-file li .am-progress {\n  margin-bottom: 4px;\n}\n\n.admin-content-file li .am-progress-bar {\n  line-height: 14px;\n}\n\n.admin-content-task {\n  margin-bottom: 0;\n}\n\n.admin-content-task li {\n  padding: 5px 0;\n  border-color: #eee;\n}\n\n.admin-content-task li:first-child {\n  border-top: none;\n}\n\n.admin-content-task li:last-child {\n  border-bottom: none;\n}\n\n.admin-task-meta {\n  font-size: 1.2rem;\n  color: #999;\n}\n\n.admin-task-bd {\n  font-size: 1.4rem;\n  margin-bottom: 5px;\n}\n\n.admin-content-comment {\n  margin-bottom: 0;\n}\n\n.admin-content-comment .am-comment-bd {\n  font-size: 1.4rem;\n}\n\n.admin-content-pagination {\n  margin-bottom: 0;\n}\n.admin-content-pagination li a {\n  padding: 4px 8px;\n}\n\n@media only screen and (min-width: 641px) {\n  .admin-sidebar {\n    display: block;\n    position: static;\n    background: none;\n  }\n\n  .admin-offcanvas-bar {\n    position: static;\n    width: auto;\n    background: none;\n    -webkit-transform: translate3d(0, 0, 0);\n    -ms-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n    overflow-y: visible;\n    min-height: 100%;\n  }\n  .admin-offcanvas-bar:after {\n    content: none;\n  }\n}\n\n@media only screen and (max-width: 640px) {\n  .admin-sidebar {\n    width: inherit;\n  }\n\n  .admin-offcanvas-bar {\n    background: #f3f3f3;\n  }\n\n  .admin-offcanvas-bar:after {\n    background: #BABABA;\n  }\n\n  .admin-sidebar-list a:hover, .admin-sidebar-list a:active{\n    -webkit-transition: background-color .3s ease;\n    -moz-transition: background-color .3s ease;\n    -ms-transition: background-color .3s ease;\n    -o-transition: background-color .3s ease;\n    transition: background-color .3s ease;\n    background: #E4E4E4;\n  }\n\n  .admin-content-list li {\n    padding: 10px;\n    border-width: 1px 0;\n    margin-top: -1px;\n  }\n\n  .admin-content-list li:first-child {\n    border-top: none;\n  }\n\n  .admin-content-list li:last-child {\n    border-bottom: none;\n  }\n\n  .admin-form-text {\n    text-align: left !important;\n  }\n\n}\n\n/*\n* user.html css\n*/\n.user-info {\n  margin-bottom: 15px;\n}\n\n.user-info .am-progress {\n  margin-bottom: 4px;\n}\n\n.user-info p {\n  margin: 5px;\n}\n\n.user-info-order {\n  font-size: 1.4rem;\n}\n\n/*\n* errorLog.html css\n*/\n\n.error-log .am-pre-scrollable {\n  max-height: 40rem;\n}\n\n/*\n* table.html css\n*/\n\n.table-main {\n  font-size: 1.4rem;\n  padding: .5rem;\n}\n\n.table-main button {\n  background: #fff;\n}\n\n.table-check {\n  width: 30px;\n}\n\n.table-id {\n  width: 50px;\n}\n\n@media only screen and (max-width: 640px) {\n  .table-select {\n    margin-top: 10px;\n    margin-left: 5px;\n  }\n}\n\n/*\ngallery.html css\n*/\n\n.gallery-list li {\n  padding: 10px;\n}\n\n.gallery-list a {\n  color: #666;\n}\n\n.gallery-list a:hover {\n  color: #3bb4f2;\n}\n\n.gallery-title {\n  margin-top: 6px;\n  font-size: 1.4rem;\n}\n\n.gallery-desc {\n  font-size: 1.2rem;\n  margin-top: 4px;\n}\n\n/*\n 404.html css\n*/\n\n.page-404 {\n  background: #fff;\n  border: none;\n  width: 200px;\n  margin: 0 auto;\n}\n\n"
  },
  {
    "path": "src/main/resources/static/assets/css/app.css",
    "content": "ul,\nli {\n  list-style: none;\n  padding: 0;\n  margin: 0;\n}\nheader {\n  z-index: 1200;\n  position: relative;\n}\n.tpl-header-logo {\n  width: 240px;\n  height: 57px;\n  display: table;\n  text-align: center;\n  position: relative;\n  z-index: 1300;\n}\n.tpl-header-logo a {\n  display: table-cell;\n  vertical-align: middle;\n}\n.tpl-header-logo img {\n  width: 170px;\n}\n.tpl-header-fluid {\n  margin-left: 240px;\n  height: 56px;\n  padding-left: 20px;\n  padding-right: 20px;\n}\n.tpl-header-switch-button {\n  margin-top: 0px;\n  margin-bottom: 0px;\n  float: left;\n  color: #cfcfcf;\n  margin-left: -20px;\n  margin-right: 0;\n  border: 0;\n  border-radius: 0;\n  padding: 0px 22px;\n  font-size: 22px;\n  line-height: 55px;\n}\n.tpl-header-switch-button:hover {\n  outline: none;\n}\n.tpl-header-search-form {\n  height: 54px;\n  line-height: 52px;\n  margin-left: 10px;\n}\n.tpl-header-search-box,\n.tpl-header-search-btn {\n  transition: all 0.4s ease-in-out;\n  color: #848c90;\n  background: none;\n  border: none;\n  outline: none;\n}\n.tpl-header-search-box {\n  font-size: 14px;\n}\n.tpl-header-search-box:hover,\n.tpl-header-search-box:active {\n  color: #fff;\n}\n.tpl-header-search-btn {\n  font-size: 15px;\n}\n.tpl-header-search-btn:hover,\n.tpl-header-search-btn:active {\n  color: #fff;\n}\n.tpl-header-navbar {\n  color: #fff;\n}\n.tpl-header-navbar li {\n  float: left;\n}\n.tpl-header-navbar a {\n  line-height: 56px;\n  display: block;\n  padding: 0 16px;\n  position: relative;\n}\n.tpl-header-navbar a .item-feed-badge {\n  position: absolute;\n  top: 9px;\n  left: 25px;\n}\nul.tpl-dropdown-content {\n  padding: 10px;\n  margin-top: 0;\n  width: 300px;\n  background-color: #2f3638;\n  border: 1px solid #525e62;\n  border-radius: 0;\n}\nul.tpl-dropdown-content li {\n  float: none;\n}\nul.tpl-dropdown-content:before,\nul.tpl-dropdown-content:after {\n  display: none;\n}\nul.tpl-dropdown-content .tpl-dropdown-menu-notifications-title {\n  font-size: 12px;\n  float: left;\n  color: rgba(255, 255, 255, 0.7);\n}\nul.tpl-dropdown-content .tpl-dropdown-menu-notifications-time {\n  float: right;\n  text-align: right;\n  color: rgba(255, 255, 255, 0.7);\n  font-size: 11px;\n  width: 50px;\n  margin-left: 10px;\n}\nul.tpl-dropdown-content .tpl-dropdown-menu-notifications:last-child .tpl-dropdown-menu-notifications-item {\n  text-align: center;\n  border: none;\n  font-size: 12px;\n}\nul.tpl-dropdown-content .tpl-dropdown-menu-notifications:last-child .tpl-dropdown-menu-notifications-item i {\n  margin-left: -6px;\n}\nul.tpl-dropdown-content .tpl-dropdown-menu-messages:last-child .tpl-dropdown-menu-messages-item {\n  text-align: center;\n  border: none;\n  font-size: 12px;\n}\nul.tpl-dropdown-content .tpl-dropdown-menu-messages:last-child .tpl-dropdown-menu-messages-item i {\n  margin-left: -6px;\n}\nul.tpl-dropdown-content .tpl-dropdown-menu-notifications-item,\nul.tpl-dropdown-content .tpl-dropdown-menu-messages-item {\n  padding: 12px;\n  color: #fff;\n  line-height: 20px;\n  border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n}\nul.tpl-dropdown-content .tpl-dropdown-menu-notifications-item:hover,\nul.tpl-dropdown-content .tpl-dropdown-menu-messages-item:hover,\nul.tpl-dropdown-content .tpl-dropdown-menu-notifications-item:focus,\nul.tpl-dropdown-content .tpl-dropdown-menu-messages-item:focus {\n  background-color: #465154;\n  color: #fff;\n}\nul.tpl-dropdown-content .tpl-dropdown-menu-notifications-item .menu-messages-ico,\nul.tpl-dropdown-content .tpl-dropdown-menu-messages-item .menu-messages-ico {\n  line-height: initial;\n  float: left;\n  width: 35px;\n  height: 35px;\n  border-radius: 50%;\n  margin-right: 10px;\n  margin-top: 6px;\n  overflow: hidden;\n}\nul.tpl-dropdown-content .tpl-dropdown-menu-notifications-item .menu-messages-ico img,\nul.tpl-dropdown-content .tpl-dropdown-menu-messages-item .menu-messages-ico img {\n  width: 100%;\n  height: auto;\n  vertical-align: middle;\n}\nul.tpl-dropdown-content .tpl-dropdown-menu-notifications-item .menu-messages-time,\nul.tpl-dropdown-content .tpl-dropdown-menu-messages-item .menu-messages-time {\n  float: right;\n  text-align: right;\n  color: rgba(255, 255, 255, 0.7);\n  font-size: 11px;\n  width: 40px;\n  margin-left: 10px;\n}\nul.tpl-dropdown-content .tpl-dropdown-menu-notifications-item .menu-messages-content,\nul.tpl-dropdown-content .tpl-dropdown-menu-messages-item .menu-messages-content {\n  display: block;\n  font-size: 12px;\n  margin-left: 5px;\n  margin-right: 5px;\n}\nul.tpl-dropdown-content .tpl-dropdown-menu-notifications-item .menu-messages-content .menu-messages-content-time,\nul.tpl-dropdown-content .tpl-dropdown-menu-messages-item .menu-messages-content .menu-messages-content-time {\n  margin-top: 3px;\n  color: rgba(255, 255, 255, 0.7);\n  font-size: 11px;\n}\n.am-dimmer {\n  z-index: 1200;\n}\n.am-modal {\n  z-index: 1300;\n}\n.am-datepicker-dropdown {\n  z-index: 1400;\n}\n.tpl-skiner {\n  transition: all 0.4s ease-in-out;\n  position: fixed;\n  z-index: 10000;\n  right: -130px;\n  top: 65px;\n}\n.tpl-skiner.active {\n  right: 0px;\n}\n.tpl-skiner-content {\n  background: rgba(0, 0, 0, 0.7);\n  width: 130px;\n  padding: 15px;\n  border-radius: 4px 0 0 4px;\n  overflow: hidden;\n}\n.fc-content .am-icon-close {\n  position: absolute;\n  right: 0;\n  top: 0px;\n}\n.tpl-skiner-toggle {\n  position: absolute;\n  top: 5px;\n  left: -40px;\n  width: 40px;\n  color: #969a9b;\n  font-size: 20px;\n  height: 40px;\n  line-height: 40px;\n  text-align: center;\n  background: rgba(0, 0, 0, 0.7);\n  cursor: pointer;\n  border-top-left-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.tpl-skiner-content-title {\n  margin: 0;\n  margin-bottom: 4px;\n  padding-bottom: 4px;\n  font-size: 16px;\n  text-transform: uppercase;\n  color: #fff;\n  border-bottom: 1px solid rgba(255, 255, 255, 0.3);\n}\n.tpl-skiner-content-bar {\n  padding-top: 10px;\n}\n.tpl-skiner-content-bar .skiner-color {\n  transition: all 0.4s ease-in-out;\n  float: left;\n  width: 25px;\n  height: 25px;\n  margin-right: 10px;\n  cursor: pointer;\n}\n.tpl-skiner-content-bar .skiner-white {\n  background: #fff;\n  border: 2px solid #eee;\n}\n.tpl-skiner-content-bar .skiner-black {\n  background: #000;\n  border: 2px solid #222;\n}\n.sub-active {\n  color: #fff!important;\n}\n.left-sidebar {\n  transition: all 0.4s ease-in-out;\n  width: 240px;\n  min-height: 100%;\n  padding-top: 57px;\n  position: absolute;\n  z-index: 1104;\n  top: 0;\n  left: 0px;\n}\n.left-sidebar.xs-active {\n  left: 0px;\n}\n.left-sidebar.active {\n  left: -240px;\n}\n.tpl-sidebar-user-panel {\n  padding: 22px;\n  padding-top: 28px;\n}\n.tpl-user-panel-profile-picture {\n  border-radius: 50%;\n  width: 82px;\n  height: 82px;\n  margin-bottom: 10px;\n  overflow: hidden;\n}\n.tpl-user-panel-profile-picture img {\n  width: auto;\n  height: 82px;\n  vertical-align: middle;\n}\n.tpl-user-panel-status-icon {\n  margin-right: 2px;\n}\n.user-panel-logged-in-text {\n  display: block;\n  color: #cfcfcf;\n  font-size: 14px;\n}\n.tpl-user-panel-action-link {\n  color: #6d787c;\n  font-size: 12px;\n}\n.tpl-user-panel-action-link:hover {\n  color: #a2aaad;\n}\n.sidebar-nav {\n  list-style-type: none;\n  padding: 0;\n  margin: 0;\n}\n.sidebar-nav-sub {\n  display: none;\n}\n.sidebar-nav-sub .sidebar-nav-link {\n  font-size: 12px;\n  padding-left: 30px;\n}\n.sidebar-nav-sub .sidebar-nav-link a {\n  font-size: 12px;\n  padding-left: 0;\n}\n.sidebar-nav-sub .sidebar-nav-link-logo {\n  margin-right: 8px;\n  width: 20px;\n  font-size: 16px;\n}\n.sidebar-nav-sub-ico-rotate {\n  -webkit-transform: rotate(180deg);\n  transform: rotate(180deg);\n  -webkit-transition: all 300ms;\n  transition: all 300ms;\n}\n.sidebar-nav-link-logo-ico {\n  margin-top: 5px;\n}\n.sidebar-nav-heading {\n  padding: 24px 17px;\n  font-size: 15px;\n  font-weight: 500;\n}\n.sidebar-nav-heading-info {\n  font-size: 12px;\n  color: #868E8E;\n  padding-left: 10px;\n}\n.sidebar-nav-link-logo {\n  margin-right: 8px;\n  width: 20px;\n  font-size: 16px;\n}\n.sidebar-nav-link {\n  color: #fff;\n}\n.sidebar-nav-link a {\n  display: block;\n  color: #868E8E;\n  padding: 10px 17px;\n  border-left: #282d2f 3px solid;\n  font-size: 14px;\n  cursor: pointer;\n}\n.sidebar-nav-link a.active {\n  cursor: pointer;\n  border-left: #1CA2CE 3px solid;\n  color: #fff;\n}\n.sidebar-nav-link a:hover {\n  color: #fff;\n}\n.tpl-content-wrapper {\n  transition: all 0.4s ease-in-out;\n  position: relative;\n  margin-left: 120px;\n  z-index: 1101;\n  min-height: 922px;\n  border-bottom-left-radius: 3px;\n}\n.tpl-content-wrapper.xs-active {\n  margin-left: 240px;\n}\n.tpl-content-wrapper.active {\n  margin-left: 0;\n}\n.page-header {\n  background: #424b4f;\n  margin-top: 0;\n  margin-bottom: 0;\n  padding: 40px 0;\n  border-bottom: 0;\n}\n.container-fluid {\n  margin-top: 0;\n  margin-bottom: 0;\n  padding: 40px 0;\n  border-bottom: 0;\n  padding-left: 20px;\n  padding-right: 20px;\n}\n.row {\n  margin-right: -10px;\n  margin-left: -10px;\n}\n.page-header-description {\n  margin-top: 4px;\n  margin-bottom: 0;\n  font-size: 14px;\n  color: #e6e6e6;\n}\n.page-header-heading {\n  font-size: 20px;\n  font-weight: 400;\n}\n.page-header-heading .page-header-heading-ico {\n  font-size: 28px;\n  position: relative;\n  top: 3px;\n}\n.page-header-heading small {\n  font-weight: normal;\n  line-height: 1;\n  color: #B3B3B3;\n}\n.page-header-button {\n  transition: all 0.4s ease-in-out;\n  opacity: 0.3;\n  float: right;\n  outline: none;\n  border: 1px solid #fff;\n  padding: 16px 36px;\n  font-size: 23px;\n  line-height: 23px;\n  border-radius: 0;\n  padding-top: 14px;\n  color: #fff;\n  background-color: rgba(0, 0, 0, 0);\n  font-weight: 500;\n}\n.page-header-button:hover {\n  background-color: #ffffff;\n  color: #333;\n  opacity: 1;\n}\n.widget {\n  width: 100%;\n  min-height: 148px;\n  margin-bottom: 20px;\n  border-radius: 0;\n  position: relative;\n}\n.widget-head {\n  width: 100%;\n  padding: 15px;\n}\n.widget-title {\n  font-size: 14px;\n}\n.widget-fluctuation-period-text {\n  display: inline-block;\n  font-size: 16px;\n  line-height: 20px;\n  margin-bottom: 9px;\n}\n.widget-body {\n  padding: 13px 15px;\n  width: 100%;\n}\n.row-content {\n  padding: 20px;\n}\n.widget-fluctuation-description-text {\n  margin-top: 4px;\n  display: block;\n  font-size: 12px;\n  line-height: 13px;\n}\n.widget-fluctuation-description-amount {\n  display: block;\n  font-size: 20px;\n  line-height: 22px;\n}\n.widget-statistic-header {\n  position: relative;\n  z-index: 35;\n  display: block;\n  font-size: 14px;\n  text-transform: uppercase;\n  margin-bottom: 8px;\n}\n.widget-body-md {\n  height: 200px;\n}\n.widget-body-lg {\n  min-height: 330px;\n}\n.widget-margin-bottom-lg {\n  margin-bottom: 20px;\n}\n.tpl-table-black-operation a {\n  display: inline-block;\n  padding: 5px 6px;\n  font-size: 12px;\n  line-height: 12px;\n}\n.tpl-switch input[type=\"checkbox\"] {\n  position: absolute;\n  opacity: 0;\n  width: 50px;\n  height: 20px;\n}\n.tpl-switch input[type=\"checkbox\"].ios-switch + div {\n  vertical-align: middle;\n  width: 40px;\n  height: 20px;\n  border-radius: 999px;\n  background-color: rgba(0, 0, 0, 0.1);\n  -webkit-transition-duration: .4s;\n  -webkit-transition-property: background-color, box-shadow;\n  margin-top: 6px;\n}\n.tpl-switch input[type=\"checkbox\"].ios-switch:checked + div {\n  width: 40px;\n  background-position: 0 0;\n  background-color: #36c6d3;\n}\n.tpl-switch input[type=\"checkbox\"].tinyswitch.ios-switch + div {\n  width: 34px;\n  height: 18px;\n}\n.tpl-switch input[type=\"checkbox\"].bigswitch.ios-switch + div {\n  width: 50px;\n  height: 25px;\n}\n.tpl-switch input[type=\"checkbox\"].green.ios-switch:checked + div {\n  background-color: #00e359;\n  border: 1px solid #00a23f;\n  box-shadow: inset 0 0 0 10px #00e359;\n}\n.tpl-switch input[type=\"checkbox\"].ios-switch + div > div {\n  float: left;\n  width: 18px;\n  height: 18px;\n  border-radius: inherit;\n  background: #ffffff;\n  -webkit-transition-timing-function: cubic-bezier(0.54, 1.85, 0.5, 1);\n  -webkit-transition-duration: 0.4s;\n  -webkit-transition-property: transform, background-color, box-shadow;\n  -moz-transition-timing-function: cubic-bezier(0.54, 1.85, 0.5, 1);\n  -moz-transition-duration: 0.4s;\n  -moz-transition-property: transform, background-color;\n  pointer-events: none;\n  margin-top: 1px;\n  margin-left: 1px;\n}\n.tpl-switch input[type=\"checkbox\"].ios-switch:checked + div > div {\n  -webkit-transform: translate3d(20px, 0, 0);\n  -moz-transform: translate3d(20px, 0, 0);\n  background-color: #ffffff;\n}\n.tpl-switch input[type=\"checkbox\"].tinyswitch.ios-switch + div > div {\n  width: 16px;\n  height: 16px;\n  margin-top: 1px;\n}\n.tpl-switch input[type=\"checkbox\"].tinyswitch.ios-switch:checked + div > div {\n  -webkit-transform: translate3d(16px, 0, 0);\n  -moz-transform: translate3d(16px, 0, 0);\n  box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.3), 0px 0px 0 1px #0850ac;\n}\n.tpl-switch input[type=\"checkbox\"].bigswitch.ios-switch + div > div {\n  width: 23px;\n  height: 23px;\n  margin-top: 1px;\n}\n.tpl-switch input[type=\"checkbox\"].bigswitch.ios-switch:checked + div > div {\n  -webkit-transform: translate3d(25px, 0, 0);\n  -moz-transform: translate3d(16px, 0, 0);\n}\n.tpl-switch input[type=\"checkbox\"].green.ios-switch:checked + div > div {\n  box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.3), 0 0 0 1px #00a23f;\n}\n.tpl-page-state {\n  width: 100%;\n}\n.tpl-page-state-title {\n  font-size: 40px;\n  font-weight: bold;\n}\n.tpl-page-state-content {\n  padding: 10px 0;\n}\n.tpl-login {\n  width: 100%;\n}\n.tpl-login-logo {\n  max-width: 159px;\n  height: 205px;\n  margin: 0 auto;\n  margin-bottom: 20px;\n}\n.tpl-login-title {\n  width: 100%;\n  font-size: 24px;\n}\n.tpl-login-content {\n  width: 300px;\n  margin: 12% auto 0;\n}\n.tpl-login-remember-me {\n  color: #B3B3B3;\n  font-size: 14px;\n}\n.tpl-login-remember-me label {\n  position: relative;\n  top: -2px;\n}\n.tpl-login-content-info {\n  color: #B3B3B3;\n  font-size: 14px;\n}\n.cl-p {\n  padding: 0!important;\n}\n.tpl-table-line-img {\n  max-width: 100px;\n  padding: 2px;\n}\n.tpl-table-list-select {\n  text-align: right;\n}\n.fc-button-group,\n.fc button {\n  display: block;\n}\n.theme-white {\n  background: #e9ecf3;\n}\n.theme-white .sidebar-nav-sub .sidebar-nav-link-logo {\n  margin-left: 10px;\n}\n.theme-white .tpl-header-search-box:hover,\n.theme-white .tpl-header-search-box:active .tpl-error-title {\n  color: #848c90;\n}\n.theme-white .tpl-error-title-info {\n  line-height: 30px;\n  font-size: 21px;\n  margin-top: 20px;\n  text-align: center;\n  color: #dce2ec;\n}\n.theme-white .tpl-error-btn {\n  background: #03a9f3;\n  border: 1px solid #03a9f3;\n  border-radius: 30px;\n  padding: 6px 20px 8px;\n}\n.theme-white .tpl-error-content {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  font-size: 16px;\n  text-align: center;\n  color: #96a2b4;\n}\n.theme-white .tpl-calendar-box {\n  background: #fff;\n  border-radius: 4px;\n  padding: 20px;\n}\n.theme-white .tpl-calendar-box .fc-event {\n  border-radius: 0;\n  background: #03a9f3;\n  border: 1px solid #14b0f6;\n}\n.theme-white .tpl-calendar-box .fc-axis {\n  color: #868E8E;\n}\n.theme-white .tpl-calendar-box .fc-unthemed .fc-today {\n  background: #eee;\n}\n.theme-white .tpl-calendar-box .fc-more {\n  color: #868E8E;\n}\n.theme-white .tpl-calendar-box .fc th.fc-widget-header {\n  background: #32c5d2!important;\n  color: #ffffff;\n  font-size: 14px;\n  line-height: 20px;\n  padding: 7px 0px;\n  text-transform: uppercase;\n  border: none!important;\n}\n.theme-white .tpl-calendar-box .fc th.fc-widget-header a {\n  color: #fff;\n}\n.theme-white .tpl-calendar-box .fc-center h2 {\n  color: #868E8E;\n}\n.theme-white .tpl-calendar-box .fc-state-default {\n  background-image: none;\n  background: #fff;\n  font-size: 14px;\n  color: #868E8E;\n}\n.theme-white .tpl-calendar-box .fc th,\n.theme-white .tpl-calendar-box .fc td,\n.theme-white .tpl-calendar-box .fc hr,\n.theme-white .tpl-calendar-box .fc thead,\n.theme-white .tpl-calendar-box .fc tbody,\n.theme-white .tpl-calendar-box .fc-row {\n  border-color: #eee!important;\n}\n.theme-white .tpl-calendar-box .fc-day-number {\n  color: #868E8E;\n  padding-right: 6px;\n}\n.theme-white .tpl-calendar-box .fc th {\n  color: #868E8E;\n  font-weight: normal;\n  font-size: 14px;\n  padding: 6px 0;\n}\n.theme-white .tpl-login-logo {\n  background: url(../img/logoa.png) center no-repeat;\n}\n.theme-white .sub-active {\n  color: #23abf0!important;\n}\n.theme-white .tpl-table-line-img {\n  border: 1px solid #ddd;\n}\n.theme-white .tpl-pagination .am-disabled a,\n.theme-white .tpl-pagination li a {\n  color: #23abf0;\n  border-radius: 3px;\n  padding: 6px 12px;\n}\n.theme-white .tpl-pagination .am-active a {\n  background: #23abf0;\n  color: #fff;\n  border: 1px solid #23abf0;\n  padding: 6px 12px;\n}\n.theme-white .tpl-login-btn {\n  background-color: #32c5d2;\n  border: none;\n  padding: 10px 16px;\n  font-size: 14px;\n  line-height: 14px;\n  outline: none;\n}\n.theme-white .tpl-login-btn:hover,\n.theme-white .tpl-login-btn:active {\n  background: #22b2e1;\n  color: #fff;\n}\n.theme-white .tpl-login-title {\n  color: #697882;\n}\n.theme-white .tpl-login-title strong {\n  color: #39bae4;\n}\n.theme-white .tpl-login-content {\n  width: 500px;\n  padding: 40px 40px 25px;\n  background-color: #fff;\n  border-radius: 4px;\n}\n.theme-white .tpl-form-line-form,\n.theme-white .tpl-form-border-form {\n  padding-top: 20px;\n}\n.theme-white .tpl-form-border-form input[type=number]:focus,\n.theme-white .tpl-form-border-form input[type=search]:focus,\n.theme-white .tpl-form-border-form input[type=text]:focus,\n.theme-white .tpl-form-border-form input[type=password]:focus,\n.theme-white .tpl-form-border-form input[type=datetime]:focus,\n.theme-white .tpl-form-border-form input[type=datetime-local]:focus,\n.theme-white .tpl-form-border-form input[type=date]:focus,\n.theme-white .tpl-form-border-form input[type=month]:focus,\n.theme-white .tpl-form-border-form input[type=time]:focus,\n.theme-white .tpl-form-border-form input[type=week]:focus,\n.theme-white .tpl-form-border-form input[type=email]:focus,\n.theme-white .tpl-form-border-form input[type=url]:focus,\n.theme-white .tpl-form-border-form input[type=tel]:focus,\n.theme-white .tpl-form-border-form input[type=color]:focus,\n.theme-white .tpl-form-border-form select:focus,\n.theme-white .tpl-form-border-form textarea:focus,\n.theme-white .am-form-field:focus {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.theme-white .tpl-form-border-form input[type=number],\n.theme-white .tpl-form-border-form input[type=search],\n.theme-white .tpl-form-border-form input[type=text],\n.theme-white .tpl-form-border-form input[type=password],\n.theme-white .tpl-form-border-form input[type=datetime],\n.theme-white .tpl-form-border-form input[type=datetime-local],\n.theme-white .tpl-form-border-form input[type=date],\n.theme-white .tpl-form-border-form input[type=month],\n.theme-white .tpl-form-border-form input[type=time],\n.theme-white .tpl-form-border-form input[type=week],\n.theme-white .tpl-form-border-form input[type=email],\n.theme-white .tpl-form-border-form input[type=url],\n.theme-white .tpl-form-border-form input[type=tel],\n.theme-white .tpl-form-border-form input[type=color],\n.theme-white .tpl-form-border-form select,\n.theme-white .tpl-form-border-form textarea,\n.theme-white .am-form-field {\n  display: block;\n  width: 100%;\n  padding: 6px 12px;\n  line-height: 1.42857;\n  color: #4d6b8a;\n  background-color: #fff;\n  background-image: none;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  background: 0 0;\n  border: 0;\n  border: 1px solid #c2cad8;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  -ms-border-radius: 0;\n  text-indent: .5em;\n  -o-border-radius: 0;\n  border-radius: 0;\n  color: #555;\n  box-shadow: none;\n  padding-left: 0;\n  padding-right: 0;\n  font-size: 14px;\n}\n.theme-white .tpl-form-border-form .am-checkbox,\n.theme-white .tpl-form-border-form .am-checkbox-inline,\n.theme-white .tpl-form-border-form .am-form-label,\n.theme-white .tpl-form-border-form .am-radio,\n.theme-white .tpl-form-border-form .am-radio-inline {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.theme-white .tpl-form-border-form .am-form-group:after {\n  clear: both;\n}\n.theme-white .tpl-form-border-form .am-form-group:after,\n.theme-white .tpl-form-border-form .am-form-group:before {\n  content: \" \";\n  display: table;\n}\n.theme-white .tpl-form-border-form .am-form-label {\n  padding-top: 5px;\n  font-size: 16px;\n  color: #888;\n  font-weight: inherit;\n  text-align: right;\n}\n.theme-white .tpl-form-border-form .am-form-group {\n  /*padding: 20px 0;*/\n}\n.theme-white .tpl-form-border-form .am-form-label .tpl-form-line-small-title {\n  color: #999;\n  font-size: 12px;\n}\n.theme-white .tpl-form-line-form input[type=number]:focus,\n.theme-white .tpl-form-line-form input[type=search]:focus,\n.theme-white .tpl-form-line-form input[type=text]:focus,\n.theme-white .tpl-form-line-form input[type=password]:focus,\n.theme-white .tpl-form-line-form input[type=datetime]:focus,\n.theme-white .tpl-form-line-form input[type=datetime-local]:focus,\n.theme-white .tpl-form-line-form input[type=date]:focus,\n.theme-white .tpl-form-line-form input[type=month]:focus,\n.theme-white .tpl-form-line-form input[type=time]:focus,\n.theme-white .tpl-form-line-form input[type=week]:focus,\n.theme-white .tpl-form-line-form input[type=email]:focus,\n.theme-white .tpl-form-line-form input[type=url]:focus,\n.theme-white .tpl-form-line-form input[type=tel]:focus,\n.theme-white .tpl-form-line-form input[type=color]:focus,\n.theme-white .tpl-form-line-form select:focus,\n.theme-white .tpl-form-line-form textarea:focus,\n.theme-white .am-form-field:focus {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.theme-white .tpl-form-line-form input[type=number],\n.theme-white .tpl-form-line-form input[type=search],\n.theme-white .tpl-form-line-form input[type=text],\n.theme-white .tpl-form-line-form input[type=password],\n.theme-white .tpl-form-line-form input[type=datetime],\n.theme-white .tpl-form-line-form input[type=datetime-local],\n.theme-white .tpl-form-line-form input[type=date],\n.theme-white .tpl-form-line-form input[type=month],\n.theme-white .tpl-form-line-form input[type=time],\n.theme-white .tpl-form-line-form input[type=week],\n.theme-white .tpl-form-line-form input[type=email],\n.theme-white .tpl-form-line-form input[type=url],\n.theme-white .tpl-form-line-form input[type=tel],\n.theme-white .tpl-form-line-form input[type=color],\n.theme-white .tpl-form-line-form select,\n.theme-white .tpl-form-line-form textarea,\n.theme-white .am-form-field {\n  display: block;\n  width: 100%;\n  padding: 6px 12px;\n  line-height: 1.42857;\n  color: #4d6b8a;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #c2cad8;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  background: 0 0;\n  border: 0;\n  border-bottom: 1px solid #c2cad8;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  -ms-border-radius: 0;\n  -o-border-radius: 0;\n  border-radius: 0;\n  color: #555;\n  box-shadow: none;\n  padding-left: 0;\n  padding-right: 0;\n  font-size: 14px;\n}\n.theme-white .tpl-form-line-form .am-checkbox,\n.theme-white .tpl-form-line-form .am-checkbox-inline,\n.theme-white .tpl-form-line-form .am-form-label,\n.theme-white .tpl-form-line-form .am-radio,\n.theme-white .tpl-form-line-form .am-radio-inline {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.theme-white .tpl-form-line-form .am-form-group:after {\n  clear: both;\n}\n.theme-white .tpl-form-line-form .am-form-group:after,\n.theme-white .tpl-form-line-form .am-form-group:before {\n  content: \" \";\n  display: table;\n}\n.theme-white .tpl-form-line-form .am-form-label {\n  padding-top: 5px;\n  font-size: 16px;\n  color: #888;\n  font-weight: inherit;\n  text-align: right;\n}\n.theme-white .tpl-form-line-form .am-form-group {\n  /*padding: 20px 0;*/\n}\n.theme-white .tpl-form-line-form .am-form-label .tpl-form-line-small-title {\n  color: #999;\n  font-size: 12px;\n}\n.theme-white .tpl-table-black-operation a {\n  border: 1px solid #36c6d3;\n  color: #36c6d3;\n}\n.theme-white .tpl-table-black-operation a:hover {\n  background: #36c6d3;\n  color: #fff;\n}\n.theme-white .tpl-table-black-operation a.tpl-table-black-operation-del {\n  border: 1px solid #e7505a;\n  color: #e7505a;\n}\n.theme-white .tpl-table-black-operation a.tpl-table-black-operation-del:hover {\n  background: #e7505a;\n  color: #fff;\n}\n.theme-white .tpl-amendment-echarts {\n  left: -17px;\n}\n.theme-white .tpl-user-card {\n  border: 1px solid #3598dc;\n  border-top: 2px solid #3598dc;\n  background: #3598dc;\n  color: #ffffff;\n  border-radius: 4px;\n}\n.theme-white .tpl-user-card-title {\n  font-size: 26px;\n  margin-top: 0;\n  font-weight: 300;\n  margin-top: 25px;\n  margin-bottom: 10px;\n}\n.theme-white .achievement-subheading {\n  font-size: 12px;\n  margin-top: 0;\n  margin-bottom: 15px;\n}\n.theme-white .achievement-image {\n  border-radius: 50%;\n  margin-bottom: 22px;\n}\n.theme-white .achievement-description {\n  margin: 0;\n  font-size: 12px;\n}\n.theme-white .tpl-table-black {\n  color: #838FA1;\n}\n.theme-white .tpl-table-black thead > tr > th {\n  font-size: 14px;\n  padding: 6px;\n}\n.theme-white .tpl-table-black tbody > tr > td {\n  font-size: 14px;\n  padding: 7px 6px;\n}\n.theme-white .tpl-table-black tfoot > tr > th {\n  font-size: 14px;\n  padding: 6px 0;\n}\n.theme-white .am-progress {\n  height: 12px;\n}\n.theme-white .am-progress-title {\n  font-size: 14px;\n  margin-bottom: 8px;\n}\n.theme-white .widget-fluctuation-tpl-btn {\n  margin-top: 6px;\n  display: block;\n  color: #fff;\n  font-size: 12px;\n  padding: 8px 14px;\n  outline: none;\n  background-color: #e7505a;\n  border: 1px solid #e7505a;\n}\n.theme-white .widget-fluctuation-tpl-btn:hover {\n  background: transparent;\n  color: #e7505a;\n}\n.theme-white .widget-fluctuation-description-text {\n  color: #c5cacd;\n}\n.theme-white .widget-fluctuation-period-text {\n  color: #838FA1;\n}\n.theme-white .text-success {\n  color: #5eb95e;\n}\n.theme-white .widget-head {\n  border-bottom: 1px solid #eef1f5;\n}\n.theme-white .widget-function a {\n  color: #838FA1;\n}\n.theme-white .widget-function a:hover {\n  color: #a7bdcd;\n}\n.theme-white .widget {\n  padding: 10px 20px 13px;\n  background-color: #fff;\n  border-radius: 4px;\n  color: #838FA1;\n}\n.theme-white .widget-title {\n  font-size: 16px;\n}\n.theme-white .widget-primary {\n  min-height: 174px;\n  border: 1px solid #32c5d2;\n  border-top: 2px solid #32c5d2;\n  background: #32c5d2;\n  color: #ffffff;\n  padding: 12px 17px;\n  padding-left: 22px;\n}\n.theme-white .widget-statistic-icon {\n  position: absolute;\n  z-index: 30;\n  right: 30px;\n  top: 24px;\n  font-size: 70px;\n  color: #46cad6;\n}\n.theme-white .widget-statistic-description {\n  position: relative;\n  z-index: 35;\n  display: block;\n  font-size: 14px;\n  line-height: 14px;\n  padding-top: 8px;\n  color: #fff;\n}\n.theme-white .widget-statistic-value {\n  position: relative;\n  z-index: 35;\n  font-weight: 300;\n  display: block;\n  color: #fff;\n  font-size: 46px;\n  line-height: 46px;\n  margin-bottom: 8px;\n}\n.theme-white .widget-statistic-header {\n  padding-top: 18px;\n  color: #fff;\n}\n.theme-white .widget-purple {\n  padding: 12px 17px;\n  border: 1px solid #8E44AD;\n  border-top: 2px solid #8E44AD;\n  background: #8E44AD;\n  color: #ffffff;\n  min-height: 174px;\n}\n.theme-white .widget-purple .widget-statistic-icon {\n  color: #9956b5;\n}\n.theme-white .widget-purple .widget-statistic-header {\n  color: #ded5e7;\n}\n.theme-white .widget-purple .widget-statistic-description {\n  color: #ded5e7;\n}\n.theme-white .page-header-button {\n  opacity: .8;\n  border: 1px solid #32c5d2;\n  background: #32c5d2;\n  color: #fff;\n}\n.theme-white .page-header-button:hover {\n  opacity: 1;\n}\n.theme-white .page-header-description {\n  color: #666;\n}\n.theme-white .page-header-heading {\n  color: #666;\n}\n.theme-white ul.tpl-dropdown-content .tpl-dropdown-menu-messages-item .menu-messages-content .menu-messages-content-time {\n  color: #96a5aa;\n}\n.theme-white ul.tpl-dropdown-content {\n  background: #fff;\n  border: 1px solid #ddd;\n}\n.theme-white ul.tpl-dropdown-content .tpl-dropdown-menu-notifications-item,\n.theme-white ul.tpl-dropdown-content .tpl-dropdown-menu-messages-item {\n  border-bottom: 1px solid #eee;\n  color: #999;\n}\n.theme-white ul.tpl-dropdown-content .tpl-dropdown-menu-notifications-item:hover,\n.theme-white ul.tpl-dropdown-content .tpl-dropdown-menu-messages-item:hover {\n  background-color: #f5f5f5;\n}\n.theme-white ul.tpl-dropdown-content .tpl-dropdown-menu-notifications-item .tpl-dropdown-menu-notifications-time,\n.theme-white ul.tpl-dropdown-content .tpl-dropdown-menu-messages-item .tpl-dropdown-menu-notifications-time {\n  color: #999;\n}\n.theme-white ul.tpl-dropdown-content .tpl-dropdown-menu-messages-item:hover {\n  background-color: #f5f5f5;\n}\n.theme-white ul.tpl-dropdown-content .tpl-dropdown-menu-notifications-title {\n  color: #999;\n}\n.theme-white .sidebar-nav-link a {\n  border-left: #fff 3px solid;\n}\n.theme-white .sidebar-nav-link a:hover {\n  background: #f2f6f9;\n  color: #868E8E;\n  border-left: #3bb4f2 3px solid;\n}\n.theme-white .sidebar-nav-link a.active {\n  background: #f2f6f9;\n  color: #868E8E;\n  border-left: #3bb4f2 3px solid;\n}\n.theme-white .sidebar-nav-heading {\n  color: #999;\n  border-bottom: 1px solid #eee;\n}\n.theme-white .tpl-sidebar-user-panel {\n  background: #fff;\n  border-bottom: 1px solid #eee;\n}\n.theme-white .tpl-content-wrapper {\n  background: #e9ecf3;\n}\n.theme-white .tpl-header-fluid {\n  background: #fff;\n  border-top: 1px solid #eee;\n}\n.theme-white .tpl-header-logo {\n  background: #fff;\n  border-bottom: 1px solid #eee;\n}\n.theme-white .tpl-header-switch-button {\n  background: #fff;\n  border-right: 1px solid #eee;\n  border-left: 1px solid #eee;\n}\n.theme-white .tpl-header-switch-button:hover {\n  background: #fff;\n  color: #999;\n}\n.theme-white .tpl-header-navbar a {\n  color: #999;\n}\n.theme-white .tpl-header-navbar a:hover {\n  color: #999;\n}\n.theme-white .left-sidebar {\n  background: #fff;\n}\n.theme-white .widget-color-green {\n  border: 1px solid #32c5d2;\n  border-top: 2px solid #32c5d2;\n  background: #32c5d2;\n  color: #ffffff;\n}\n.theme-white .widget-color-green .widget-fluctuation-period-text {\n  color: #fff;\n}\n.theme-white .widget-color-green .widget-head {\n  border-bottom: 1px solid #2bb8c4;\n}\n.theme-white .widget-color-green .widget-fluctuation-description-text {\n  color: #bbe7f6;\n}\n.theme-white .widget-color-green .widget-function a {\n  color: #42bde5;\n}\n.theme-white .widget-color-green .widget-function a:hover {\n  color: #fff;\n}\n.theme-black {\n  background-color: #282d2f;\n}\n.theme-black .tpl-am-model-bd {\n  background: #424b4f;\n}\n.theme-black .tpl-model-dialog {\n  background: #424b4f;\n}\n.theme-black .tpl-error-title {\n  font-size: 210px;\n  line-height: 220px;\n  color: #868E8E;\n}\n.theme-black .tpl-error-title-info {\n  line-height: 30px;\n  font-size: 21px;\n  margin-top: 20px;\n  text-align: center;\n  color: #868E8E;\n}\n.theme-black .tpl-error-btn {\n  background: #03a9f3;\n  border: 1px solid #03a9f3;\n  border-radius: 30px;\n  padding: 6px 20px 8px;\n}\n.theme-black .tpl-error-content {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  font-size: 16px;\n  text-align: center;\n  color: #cfcfcf;\n}\n.theme-black .tpl-calendar-box {\n  background: #424b4f;\n  padding: 20px;\n}\n.theme-black .tpl-calendar-box .fc-button {\n  border-radius: 0;\n  box-shadow: 0;\n}\n.theme-black .tpl-calendar-box .fc-event {\n  border-radius: 0;\n  background: #03a9f3;\n}\n.theme-black .tpl-calendar-box .fc-axis {\n  color: #fff;\n}\n.theme-black .tpl-calendar-box .fc-unthemed .fc-today {\n  background: #3a4144;\n}\n.theme-black .tpl-calendar-box .fc-more {\n  color: #fff;\n}\n.theme-black .tpl-calendar-box .fc th.fc-widget-header {\n  background: #9675ce!important;\n  color: #ffffff;\n  font-size: 14px;\n  line-height: 20px;\n  padding: 7px 0px;\n  text-transform: uppercase;\n  border: none!important;\n}\n.theme-black .tpl-calendar-box .fc th.fc-widget-header a {\n  color: #fff;\n}\n.theme-black .tpl-calendar-box .fc-center h2 {\n  color: #fff;\n}\n.theme-black .tpl-calendar-box .fc-state-default {\n  background-image: none;\n  background: #fff;\n  font-size: 14px;\n}\n.theme-black .tpl-calendar-box .fc th,\n.theme-black .tpl-calendar-box .fc td,\n.theme-black .tpl-calendar-box .fc hr,\n.theme-black .tpl-calendar-box .fc thead,\n.theme-black .tpl-calendar-box .fc tbody,\n.theme-black .tpl-calendar-box .fc-row {\n  border-color: rgba(120, 130, 140, 0.4) !important;\n}\n.theme-black .tpl-calendar-box .fc-day-number {\n  color: #868E8E;\n  padding-right: 6px;\n}\n.theme-black .tpl-calendar-box .fc th {\n  color: #868E8E;\n  font-weight: normal;\n  font-size: 14px;\n  padding: 6px 0;\n}\n.theme-black .tpl-login-logo {\n  background: url(../img/logob.png) center no-repeat;\n}\n.theme-black .tpl-table-line-img {\n  max-width: 100px;\n  padding: 2px;\n  border: none;\n}\n.theme-black .tpl-table-list-field {\n  border: none;\n}\n.theme-black .tpl-table-list-select .am-dropdown-content {\n  color: #888;\n}\n.theme-black .tpl-table-list-select .am-selected-btn {\n  border: 1px solid rgba(255, 255, 255, 0.2);\n  color: #fff;\n}\n.theme-black .tpl-table-list-select .am-btn-default.am-active,\n.theme-black .tpl-table-list-select .am-btn-default:active,\n.theme-black .tpl-table-list-select .am-dropdown.am-active .am-btn-default.am-dropdown-toggle {\n  border: 1px solid rgba(255, 255, 255, 0.2);\n  color: #fff;\n  background: #5d6468;\n}\n.theme-black .tpl-pagination .am-disabled a,\n.theme-black .tpl-pagination li a {\n  color: #fff;\n  padding: 6px 12px;\n  background: #3f4649;\n  border: none;\n}\n.theme-black .tpl-pagination .am-active a {\n  background: #167fa1;\n  color: #fff;\n  border: 1px solid #167fa1;\n  padding: 6px 12px;\n}\n.theme-black .tpl-login-btn {\n  border: 1px solid #b5b5b5;\n  background-color: rgba(0, 0, 0, 0);\n  padding: 10px 16px;\n  font-size: 14px;\n  line-height: 14px;\n  color: #b5b5b5;\n}\n.theme-black .tpl-login-btn:hover,\n.theme-black .tpl-login-btn:active {\n  background: #b5b5b5;\n  color: #fff;\n}\n.theme-black .tpl-login-title {\n  color: #fff;\n}\n.theme-black .tpl-login-title strong {\n  color: #39bae4;\n}\n.theme-black .tpl-form-line-form,\n.theme-black .tpl-form-border-form {\n  padding-top: 20px;\n}\n.theme-black .tpl-form-line-form .am-btn-default,\n.theme-black .tpl-form-border-form .am-btn-default {\n  color: #fff;\n  border: 1px solid rgba(255, 255, 255, 0.2);\n}\n.theme-black .tpl-form-line-form .am-selected-text,\n.theme-black .tpl-form-border-form .am-selected-text {\n  color: #888;\n}\n.theme-black .tpl-form-border-form input[type=number]:focus,\n.theme-black .tpl-form-border-form input[type=search]:focus,\n.theme-black .tpl-form-border-form input[type=text]:focus,\n.theme-black .tpl-form-border-form input[type=password]:focus,\n.theme-black .tpl-form-border-form input[type=datetime]:focus,\n.theme-black .tpl-form-border-form input[type=datetime-local]:focus,\n.theme-black .tpl-form-border-form input[type=date]:focus,\n.theme-black .tpl-form-border-form input[type=month]:focus,\n.theme-black .tpl-form-border-form input[type=time]:focus,\n.theme-black .tpl-form-border-form input[type=week]:focus,\n.theme-black .tpl-form-border-form input[type=email]:focus,\n.theme-black .tpl-form-border-form input[type=url]:focus,\n.theme-black .tpl-form-border-form input[type=tel]:focus,\n.theme-black .tpl-form-border-form input[type=color]:focus,\n.theme-black .tpl-form-border-form select:focus,\n.theme-black .tpl-form-border-form textarea:focus,\n.theme-black .am-form-field:focus {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.theme-black .tpl-form-border-form input[type=number],\n.theme-black .tpl-form-border-form input[type=search],\n.theme-black .tpl-form-border-form input[type=text],\n.theme-black .tpl-form-border-form input[type=password],\n.theme-black .tpl-form-border-form input[type=datetime],\n.theme-black .tpl-form-border-form input[type=datetime-local],\n.theme-black .tpl-form-border-form input[type=date],\n.theme-black .tpl-form-border-form input[type=month],\n.theme-black .tpl-form-border-form input[type=time],\n.theme-black .tpl-form-border-form input[type=week],\n.theme-black .tpl-form-border-form input[type=email],\n.theme-black .tpl-form-border-form input[type=url],\n.theme-black .tpl-form-border-form input[type=tel],\n.theme-black .tpl-form-border-form input[type=color],\n.theme-black .tpl-form-border-form select,\n.theme-black .tpl-form-border-form textarea,\n.theme-black .am-form-field {\n  display: block;\n  width: 100%;\n  padding: 6px 12px;\n  line-height: 1.42857;\n  color: #4d6b8a;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #c2cad8;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  background: 0 0;\n  border: 0;\n  text-indent: .5em;\n  border: 1px solid rgba(255, 255, 255, 0.2);\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  -ms-border-radius: 0;\n  -o-border-radius: 0;\n  border-radius: 0;\n  color: #fff;\n  box-shadow: none;\n  padding-left: 0;\n  padding-right: 0;\n  font-size: 14px;\n}\n.theme-black .tpl-form-border-form .am-checkbox,\n.theme-black .tpl-form-border-form .am-checkbox-inline,\n.theme-black .tpl-form-border-form .am-form-label,\n.theme-black .tpl-form-border-form .am-radio,\n.theme-black .tpl-form-border-form .am-radio-inline {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.theme-black .tpl-form-border-form .am-form-group:after {\n  clear: both;\n}\n.theme-black .tpl-form-border-form .am-form-group:after,\n.theme-black .tpl-form-border-form .am-form-group:before {\n  content: \" \";\n  display: table;\n}\n.theme-black .tpl-form-border-form .am-form-label {\n  padding-top: 5px;\n  font-size: 16px;\n  color: #fff;\n  font-weight: inherit;\n  text-align: right;\n}\n.theme-black .tpl-form-border-form .am-form-group {\n  /*padding: 20px 0;*/\n}\n.theme-black .tpl-form-border-form .am-form-label .tpl-form-line-small-title {\n  color: #999;\n  font-size: 12px;\n}\n.theme-black .tpl-form-line-form input[type=number]:focus,\n.theme-black .tpl-form-line-form input[type=search]:focus,\n.theme-black .tpl-form-line-form input[type=text]:focus,\n.theme-black .tpl-form-line-form input[type=password]:focus,\n.theme-black .tpl-form-line-form input[type=datetime]:focus,\n.theme-black .tpl-form-line-form input[type=datetime-local]:focus,\n.theme-black .tpl-form-line-form input[type=date]:focus,\n.theme-black .tpl-form-line-form input[type=month]:focus,\n.theme-black .tpl-form-line-form input[type=time]:focus,\n.theme-black .tpl-form-line-form input[type=week]:focus,\n.theme-black .tpl-form-line-form input[type=email]:focus,\n.theme-black .tpl-form-line-form input[type=url]:focus,\n.theme-black .tpl-form-line-form input[type=tel]:focus,\n.theme-black .tpl-form-line-form input[type=color]:focus,\n.theme-black .tpl-form-line-form select:focus,\n.theme-black .tpl-form-line-form textarea:focus,\n.theme-black .am-form-field:focus {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.theme-black .tpl-form-line-form input[type=number],\n.theme-black .tpl-form-line-form input[type=search],\n.theme-black .tpl-form-line-form input[type=text],\n.theme-black .tpl-form-line-form input[type=password],\n.theme-black .tpl-form-line-form input[type=datetime],\n.theme-black .tpl-form-line-form input[type=datetime-local],\n.theme-black .tpl-form-line-form input[type=date],\n.theme-black .tpl-form-line-form input[type=month],\n.theme-black .tpl-form-line-form input[type=time],\n.theme-black .tpl-form-line-form input[type=week],\n.theme-black .tpl-form-line-form input[type=email],\n.theme-black .tpl-form-line-form input[type=url],\n.theme-black .tpl-form-line-form input[type=tel],\n.theme-black .tpl-form-line-form input[type=color],\n.theme-black .tpl-form-line-form select,\n.theme-black .tpl-form-line-form textarea,\n.theme-black .am-form-field {\n  display: block;\n  width: 100%;\n  padding: 6px 12px;\n  line-height: 1.42857;\n  color: #4d6b8a;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #c2cad8;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n  background: 0 0;\n  border: 0;\n  border-bottom: 1px solid rgba(255, 255, 255, 0.2);\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  -ms-border-radius: 0;\n  -o-border-radius: 0;\n  border-radius: 0;\n  color: #fff;\n  box-shadow: none;\n  padding-left: 0;\n  padding-right: 0;\n  font-size: 14px;\n}\n.theme-black .tpl-form-line-form .am-checkbox,\n.theme-black .tpl-form-line-form .am-checkbox-inline,\n.theme-black .tpl-form-line-form .am-form-label,\n.theme-black .tpl-form-line-form .am-radio,\n.theme-black .tpl-form-line-form .am-radio-inline {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.theme-black .tpl-form-line-form .am-form-group:after {\n  clear: both;\n}\n.theme-black .tpl-form-line-form .am-form-group:after,\n.theme-black .tpl-form-line-form .am-form-group:before {\n  content: \" \";\n  display: table;\n}\n.theme-black .tpl-form-line-form .am-form-label {\n  padding-top: 5px;\n  font-size: 16px;\n  color: #fff;\n  font-weight: inherit;\n  text-align: right;\n}\n.theme-black .tpl-form-line-form .am-form-group {\n  /*padding: 20px 0;*/\n}\n.theme-black .tpl-form-line-form .am-form-label .tpl-form-line-small-title {\n  color: #999;\n  font-size: 12px;\n}\n.theme-black .tpl-table-black-operation a {\n  border: 1px solid #7b878d;\n  color: #7b878d;\n}\n.theme-black .tpl-table-black-operation a:hover {\n  background: #7b878d;\n  color: #fff;\n}\n.theme-black .tpl-table-black-operation a.tpl-table-black-operation-del {\n  border: 1px solid #f35842;\n  color: #f35842;\n}\n.theme-black .tpl-table-black-operation a.tpl-table-black-operation-del:hover {\n  background: #f35842;\n  color: #fff;\n}\n.theme-black .am-table-bordered {\n  border: 1px solid #666d70;\n}\n.theme-black .am-table-bordered > tbody > tr > td,\n.theme-black .am-table-bordered > tbody > tr > th,\n.theme-black .am-table-bordered > tfoot > tr > td,\n.theme-black .am-table-bordered > tfoot > tr > th,\n.theme-black .am-table-bordered > thead > tr > td,\n.theme-black .am-table-bordered > thead > tr > th {\n  border: 1px solid #666d70;\n}\n.theme-black .am-table-bordered > thead + tbody > tr:first-child > td,\n.theme-black .am-table-bordered > thead + tbody > tr:first-child > th {\n  border: 1px solid #666d70;\n}\n.theme-black .am-table-striped > tbody > tr:nth-child(odd) > td,\n.theme-black .am-table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #5d6468;\n}\n.theme-black .tpl-table-black {\n  color: #fff;\n}\n.theme-black .tpl-table-black thead > tr > th {\n  font-size: 14px;\n  padding: 6px;\n  border-bottom: 1px solid #666d70;\n}\n.theme-black .tpl-table-black tbody > tr > td {\n  font-size: 14px;\n  padding: 7px 6px;\n  border-top: 1px solid #666d70;\n}\n.theme-black .tpl-table-black tfoot > tr > th {\n  font-size: 14px;\n  padding: 6px 0;\n}\n.theme-black .tpl-user-card {\n  border: 1px solid #11627d;\n  border-top: 2px solid #105f79;\n  background: #1786aa;\n  color: #ffffff;\n}\n.theme-black .tpl-user-card-title {\n  font-size: 26px;\n  margin-top: 0;\n  font-weight: 300;\n  margin-top: 25px;\n  margin-bottom: 10px;\n}\n.theme-black .achievement-subheading {\n  font-size: 12px;\n  margin-top: 0;\n  margin-bottom: 15px;\n}\n.theme-black .achievement-image {\n  border-radius: 50%;\n  margin-bottom: 22px;\n}\n.theme-black .achievement-description {\n  margin: 0;\n  font-size: 12px;\n}\n.theme-black .am-progress {\n  height: 12px;\n  margin-bottom: 14px;\n  background: rgba(0, 0, 0, 0.15);\n}\n.theme-black .am-progress-title {\n  font-size: 14px;\n  margin-bottom: 8px;\n}\n.theme-black .am-progress-title-more {\n  color: #a1a8ab;\n}\n.theme-black .widget-fluctuation-tpl-btn {\n  margin-top: 6px;\n  display: block;\n  color: #fff;\n  font-size: 12px;\n  padding: 5px 10px;\n  outline: none;\n  background-color: rgba(255, 255, 255, 0);\n  border: 1px solid #fff;\n}\n.theme-black .widget-fluctuation-tpl-btn:hover {\n  background: #fff;\n  color: #4b5357;\n}\n.theme-black .widget-fluctuation-description-text {\n  color: #c5cacd;\n}\n.theme-black .text-success {\n  color: #08ed72;\n}\n.theme-black .widget-fluctuation-period-text {\n  color: #fff;\n}\n.theme-black .widget-head {\n  border-bottom: 1px solid #3f4649;\n}\n.theme-black .widget-function a {\n  color: #7b878d;\n}\n.theme-black .widget-function a:hover {\n  color: #fff;\n}\n.theme-black .widget {\n  border: 1px solid #33393c;\n  border-top: 2px solid #313639;\n  background: #4b5357;\n  color: #ffffff;\n}\n.theme-black .widget-primary {\n  border: 1px solid #11627d;\n  border-top: 2px solid #105f79;\n  background: #1786aa;\n  color: #ffffff;\n  padding: 12px 17px;\n}\n.theme-black .widget-statistic-icon {\n  position: absolute;\n  z-index: 30;\n  right: 30px;\n  top: 0px;\n  font-size: 70px;\n  color: #1b9eca;\n}\n.theme-black .widget-statistic-description {\n  position: relative;\n  z-index: 35;\n  display: block;\n  font-size: 14px;\n  line-height: 14px;\n  padding-top: 8px;\n  color: #9cdcf2;\n}\n.theme-black .widget-statistic-value {\n  position: relative;\n  z-index: 35;\n  font-weight: 300;\n  display: block;\n  color: #fff;\n  font-size: 46px;\n  line-height: 46px;\n  margin-bottom: 8px;\n}\n.theme-black .widget-statistic-header {\n  color: #9cdcf2;\n}\n.theme-black .widget-purple {\n  padding: 12px 17px;\n  border: 1px solid #5e4578;\n  border-top: 2px solid #5c4375;\n  background: #785799;\n  color: #ffffff;\n}\n.theme-black .widget-purple .widget-statistic-icon {\n  color: #8a6aaa;\n}\n.theme-black .widget-purple .widget-statistic-header {\n  color: #ded5e7;\n}\n.theme-black .widget-purple .widget-statistic-description {\n  color: #ded5e7;\n}\n.theme-black .page-header-description {\n  color: #e6e6e6;\n}\n.theme-black .page-header-heading {\n  color: #666;\n}\n.theme-black .container-fluid {\n  background: #424b4f;\n}\n.theme-black .page-header-heading {\n  color: #fff;\n}\n.theme-black .sidebar-nav-heading {\n  color: #fff;\n}\n.theme-black .tpl-sidebar-user-panel {\n  background: #1f2224;\n  border-bottom: 1px solid #1f2224;\n}\n.theme-black .tpl-content-wrapper {\n  background: #3a4144;\n}\n.theme-black .tpl-header-fluid {\n  background: #2f3638;\n}\n.theme-black .sidebar-nav-link a.active {\n  background: #232829;\n}\n.theme-black .sidebar-nav-link a:hover {\n  background: #232829;\n}\n.theme-black .tpl-header-switch-button {\n  background: #2f3638;\n  border-right: 1px solid #282d2f;\n}\n.theme-black .tpl-header-switch-button:hover {\n  background: #282d2f;\n  color: #fff;\n}\n.theme-black .tpl-header-navbar a {\n  color: #cfcfcf;\n}\n.theme-black .tpl-header-navbar a:hover {\n  color: #fff;\n}\n.theme-black .left-sidebar {\n  padding-top: 56px;\n  background: #282d2f;\n}\n.theme-black .widget-color-green {\n  border: 1px solid #11627d;\n  border-top: 2px solid #105f79;\n  background: #1786aa;\n  color: #ffffff;\n}\n.theme-black .widget-color-green .widget-head {\n  border-bottom: 1px solid #147494;\n}\n.theme-black .widget-color-green .widget-fluctuation-description-text {\n  color: #bbe7f6;\n}\n.theme-black .widget-color-green .widget-function a {\n  color: #42bde5;\n}\n.theme-black .widget-color-green .widget-function a:hover {\n  color: #fff;\n}\n@media screen and (max-width: 1024px) {\n  .tpl-index-settings-button {\n    display: none;\n  }\n  .theme-black .left-sidebar {\n    padding-top: 111px;\n  }\n  .left-sidebar {\n    padding-top: 111px;\n  }\n  .tpl-content-wrapper {\n    margin-left: 0;\n  }\n  .tpl-header-logo {\n    float: none;\n    width: 100%;\n  }\n  .tpl-header-navbar-welcome {\n    display: none;\n  }\n  .tpl-sidebar-user-panel {\n    border-top: 1px solid #eee;\n  }\n  .tpl-header-fluid {\n    border-top: none;\n    margin-left: 0;\n  }\n  .theme-white .tpl-header-fluid {\n    border-top: none;\n  }\n  .theme-black .tpl-sidebar-user-panel {\n    border-top: 1px solid #1f2224;\n  }\n}\n@media screen and (min-width: 641px) {\n  [class*=am-u-] {\n    padding-left: 10px;\n    padding-right: 10px;\n  }\n}\n@media screen and (max-width: 641px) {\n  .theme-white .tpl-error-title,\n  .theme-black .tpl-error-title {\n    font-size: 130px;\n    line-height: 140px;\n  }\n  .theme-white .tpl-login-title {\n    font-size: 20px;\n  }\n  .theme-white .tpl-login-content {\n    width: 86%;\n    padding: 22px 30px 25px;\n  }\n  .tpl-header-search {\n    display: none;\n  }\n  ul.tpl-dropdown-content {\n    position: fixed;\n    width: 100%;\n    left: 0;\n    top: 112px;\n    right: 0;\n  }\n}\n\n[v-cloak] { display: none }\n\nth{\n  text-align: center;\n}"
  },
  {
    "path": "src/main/resources/static/assets/css/app.less",
    "content": "ul,li {\n    list-style: none;\n    padding: 0;\n    margin: 0;\n}\n\na {\n    \n}\n\nheader {\n    z-index: 1200;\n    position: relative;\n}\n.tpl-header-logo {\n    width: 240px;\n    height: 57px;\n    display: table;\n    text-align:center;\n    position: relative;\n    z-index: 1300;\n\n    a {\n        display:table-cell;\n        vertical-align:middle;\n    }\n\n    img {\n        width:170px;\n    }\n}\n\n\n.tpl-header-fluid {\n    margin-left: 240px;\n    height: 56px;\n    \n    padding-left: 20px;\n    padding-right: 20px;\n}\n\n\n.tpl-header-switch-button {\n\n    margin-top: 0px;\n    margin-bottom: 0px;\n    float: left;\n    color: #cfcfcf;\n    margin-left: -20px;\n    margin-right: 0;\n    border: 0;\n    border-radius: 0;\n    padding: 0px 22px;\n    font-size: 22px;\n    line-height: 55px;\n    \n    &:hover {\n      \n        outline: none;\n    }\n}\n\n\n.tpl-header-search-form {\n    height: 54px;\n    line-height: 52px;\n    margin-left: 10px;\n\n}\n.tpl-header-search-box , .tpl-header-search-btn {\n    transition: all 0.4s ease-in-out;\n    color: #848c90;\n    background: none;\n    border: none;\n    outline: none;\n}\n\n.tpl-header-search-box {\n    font-size: 14px;\n\n    &:hover,&:active {\n        color: #fff;\n    }\n}\n\n.tpl-header-search-btn {\n    font-size: 15px;\n\n    &:hover,&:active {\n        color: #fff;\n    }\n}\n\n.tpl-header-navbar {\n    color: #fff;\n    li {\n        float: left;\n    }\n    a {\n        line-height: 56px;\n        display: block;\n        padding: 0 16px;\n        position: relative;\n\n\n        &:hover {\n\n        }\n        \n        .item-feed-badge {\n            position: absolute;\n            top: 9px;\n            left: 25px;\n        }\n    }\n}\n\nul.tpl-dropdown-content {\n    padding: 10px;\n    margin-top: 0;\n    width: 300px;\n    background-color: #2f3638;\n    border: 1px solid #525e62;\n    border-radius: 0;\n\n    li {\n        float:none;\n    }\n\n    &:before , &:after {\n        display: none;\n    }\n}\n\n\nul.tpl-dropdown-content {\n\n\n    .tpl-dropdown-menu-notifications {\n        \n    }\n\n    .tpl-dropdown-menu-notifications-title {\n        font-size: 12px;\n        float: left;\n        color: rgba(255, 255, 255, 0.7);\n    }\n\n    .tpl-dropdown-menu-notifications-time {\n         float: right;\n        text-align: right;\n        color: rgba(255, 255, 255, 0.7);\n        font-size: 11px;\n        width: 50px;\n        margin-left: 10px;\n    }\n\n    .tpl-dropdown-menu-notifications:last-child .tpl-dropdown-menu-notifications-item {\n            text-align: center;\n            border: none;\n            font-size: 12px;\n            i {\n                margin-left: -6px;\n            }\n    }\n\n    .tpl-dropdown-menu-messages:last-child .tpl-dropdown-menu-messages-item {\n            text-align: center;\n            border: none;\n            font-size: 12px;\n            i {\n                margin-left: -6px;\n            }\n    }\n    .tpl-dropdown-menu-notifications-item , .tpl-dropdown-menu-messages-item {\n        padding: 12px;\n        color: #fff;\n        line-height: 20px;\n        border-bottom: 1px solid rgba(255, 255, 255, 0.15);\n\n        &:hover , &:focus {\n                background-color: #465154;\n                color: #fff;\n        }\n\n        \n\n        .menu-messages-ico {\n            line-height: initial;\n            float: left;\n            width: 35px;\n            height: 35px;\n            border-radius: 50%;\n            margin-right: 10px;\n            margin-top: 6px;\n            overflow: hidden;\n\n            img {\n                width: 100%;\n                height: auto;\n                vertical-align: middle;\n            }\n        }\n\n        .menu-messages-time {\n            float: right;\n            text-align: right;\n            color: rgba(255, 255, 255, 0.7);\n            font-size: 11px;\n            width: 40px;\n            margin-left: 10px;\n\n            \n        }\n\n        .menu-messages-content {\n            display: block;\n            font-size: 13px;\n            margin-left: 45px;\n            margin-right: 50px;\n\n            .menu-messages-content-title {\n\n            }\n\n            .menu-messages-content-time {\n                margin-top: 3px;\n                color: rgba(255, 255, 255, 0.7);\n                font-size: 11px;\n            }\n        }\n\n       \n    }\n}\n\n.am-dimmer {\n    z-index: 1200;\n}\n.am-modal {\n    z-index: 1300;\n}\n.am-datepicker-dropdown {\n    z-index: 1400;\n}\n\n.tpl-skiner {\n    transition: all 0.4s ease-in-out;\n    position: fixed;\n    z-index: 10000;\n    right: -130px;\n    top: 65px;\n}\n\n.tpl-skiner.active {\n    right: 0px;\n}\n.tpl-skiner-content {\n    background: rgba(0, 0, 0, 0.7);\n    width: 130px;\n    padding: 15px;\n    border-radius: 4px 0 0 4px;\n    overflow: hidden;\n}\n\n.fc-content .am-icon-close {\n    position: absolute;\n    right: 0;\n    top: 0px;\n}\n.tpl-skiner-toggle {\n    position: absolute;\n    top: 5px;\n    left: -40px;\n    width: 40px;\n    color:#969a9b;\n    font-size: 20px;\n    height: 40px;\n    line-height: 40px;\n    text-align: center;\n    background: rgba(0, 0, 0, 0.7);\n    cursor: pointer;\n    border-top-left-radius: 4px;\n    border-bottom-left-radius: 4px;\n\n}\n.tpl-skiner-content-title {\n    margin: 0;\n    margin-bottom: 4px;\n    padding-bottom: 4px;\n    font-size: 16px;\n    text-transform: uppercase;\n    color:#fff;\n    border-bottom: 1px solid rgba(255, 255, 255, 0.3);\n}\n\n.tpl-skiner-content-bar {\n    padding-top: 10px;\n    .skiner-color {\n        transition: all 0.4s ease-in-out;\n        float: left;\n        width: 25px;\n        height: 25px;\n        margin-right: 10px;\n        cursor: pointer;\n    }\n    .skiner-white {\n        background: #fff;\n        border: 2px solid #eee;\n    }\n\n    .skiner-black {\n        background: #000;\n        border: 2px solid #222;\n    }\n}\n\n.sub-active {\n    color:#fff!important;\n}\n.left-sidebar {\n        transition: all 0.4s ease-in-out;\n    width: 240px;\n    min-height: 100%;\n    padding-top: 57px;\n    position: absolute;\n    z-index: 1104;\n    top: 0;\n    left: 0px;\n    &.xs-active {\n        left:0px;\n    }\n    &.active {\n        left:-240px;\n    }\n    \n}\n.tpl-sidebar-user-panel {\n    padding: 22px;\n    padding-top: 28px;\n}\n\n.tpl-user-panel-slide-toggleable {\n\n}\n\n.tpl-user-panel-profile-picture {\n    border-radius: 50%;\n    width: 82px;\n    height: 82px;\n    margin-bottom: 10px;\n    overflow: hidden;\n\n    img {\n        width: auto;\n        height: 82px;\n        vertical-align: middle;\n    }\n}\n.tpl-user-panel-status-icon {\n        margin-right: 2px;\n}\n.user-panel-logged-in-text {\n    display: block;\n\n    color:#cfcfcf;\n    font-size: 14px;\n}\n.tpl-user-panel-action-link {\n    color: #6d787c;\n    font-size: 12px;\n    &:hover {\n        color: #a2aaad;\n    }\n}\n\n.sidebar-nav {\n    list-style-type: none;\n    padding: 0;\n    margin: 0;\n}\n\n.sidebar-nav-sub {\n    display: none;\n    .sidebar-nav-link {\n        font-size: 12px;\n        padding-left: 30px;\n    a {\n        font-size: 12px;\n        padding-left: 0;\n    }\n    }\n\n    .sidebar-nav-link-logo {\n            margin-right: 8px;\n    width: 20px;\n    font-size: 16px;\n    }\n}\n\n.sidebar-nav-sub-ico-rotate{\n    -webkit-transform: rotate(180deg);\n    transform: rotate(180deg);\n    -webkit-transition: all 300ms;\n    transition: all 300ms;\n}\n.sidebar-nav-link-logo-ico {\n    margin-top: 5px;\n}\n.sidebar-nav-heading {\n    padding: 24px 17px;\n    font-size: 15px;\n    font-weight: 500;\n}\n.sidebar-nav-heading-info {\n    font-size: 12px;\n    color:#868E8E;\n    padding-left: 10px;\n}\n.sidebar-nav-link-logo {\n    margin-right: 8px;\n    width: 20px;\n    font-size: 16px;\n}\n.sidebar-nav-link {\n \n    color: #fff;\n\n    a {\n        display: block;\n        color: #868E8E;\n        padding: 10px 17px;\n        border-left: #282d2f 3px solid;\n        font-size: 14px;\n        cursor: pointer;\n\n        &.active {\n            cursor: pointer;\n            border-left: #1CA2CE 3px solid;\n            color: #fff;\n            \n        }\n\n        &:hover {\n            color: #fff;\n        }\n    }\n}\n\n.tpl-content-wrapper {\n    transition: all 0.4s ease-in-out;\n    position: relative;\n    margin-left: 240px;\n    z-index: 1101;\n    min-height: 922px;\n    border-bottom-left-radius: 3px;\n    &.xs-active {\n        margin-left: 240px;\n    }\n    &.active {\n        margin-left: 0;\n    }\n}\n\n.page-header {\n    background: #424b4f;\n    margin-top: 0;\n    margin-bottom: 0;\n    padding: 40px 0;\n    border-bottom: 0;\n}\n\n.container-fluid {\n    margin-top: 0;\n    margin-bottom: 0;\n    padding: 40px 0;\n    border-bottom: 0;\n        padding-left: 20px;\n    padding-right: 20px;\n}\n\n.row {\n    margin-right: -10px;\n    margin-left: -10px;\n}\n\n.page-header-description {\n    margin-top: 4px;\n    margin-bottom: 0;\n    font-size: 14px;\n    color: #e6e6e6;\n}\n.page-header-heading {\n    font-size: 20px;\n    font-weight: 400;\n    .page-header-heading-ico {\n        font-size: 28px;\n        position: relative;\n        top: 3px;\n    }\n    small {\n            font-weight: normal;\n    line-height: 1;\n    color: #B3B3B3;\n    }\n}\n\n.page-header-button {\n    transition: all 0.4s ease-in-out;\n    opacity: 0.3;\n    font-weight: 500;\n    border-radius: 0;\n    float: right;\n    outline: none;\n    border: 1px solid #fff;\n    padding: 16px 36px;\n    font-size: 23px;\n    line-height: 23px;\n    border-radius: 0;\n    padding-top: 14px;\n    color: #fff;\n    background-color: rgba(0, 0, 0, 0);\n    font-weight: 500;\n\n    &:hover {\n        background-color: #ffffff;\n        color: #333;\n        opacity: 1;\n    }\n}\n.widget {\n    width: 100%;\n        min-height: 148px;\n    margin-bottom: 20px;\n    border-radius: 0;\n    position: relative;\n}\n\n.widget-head {\n    width: 100%;\n    padding: 15px;\n}\n\n.widget-title  {\n    font-size: 14px;\n}\n.widget-function {\n      \n}\n.widget-fluctuation-period-text {\n    display: inline-block;\n    font-size: 16px;\n    line-height: 20px;\n    margin-bottom: 9px;\n}\n.widget-body {\n    padding: 13px 15px;\n    width: 100%;\n}\n.row-content {\n    padding: 20px;\n}\n\n.widget-fluctuation-description-text{\nmargin-top: 4px;\n    display: block;\n    font-size: 12px;\n    line-height: 13px;\n    }\n\n.text-success {\n\n}\n.widget-fluctuation-tpl-btn {\n\n}\n.widget-fluctuation-description-amount {\n    display: block;\n    font-size: 20px;\n    line-height: 22px;\n}\n\n.widget-primary {\n\n}\n\n.widget-statistic-header {\n    position: relative;\n    z-index: 35;\n    display: block;\n    font-size: 14px;\n    text-transform: uppercase;\n    margin-bottom: 8px;\n}\n .widget-body-md {\n      height: 200px;\n  }\n.widget-body-lg {\n    min-height: 330px;\n    // height: 330px;\n}\n.widget-margin-bottom-lg {\n    margin-bottom: 20px;\n}\n\n.tpl-table-black-operation {\n\n}\n\n\n.tpl-table-black-operation {\n    a {\n        display: inline-block;\n        padding: 5px 6px;\n        font-size: 12px;\n        line-height: 12px;\n    }\n}\n.tpl-switch input[type=\"checkbox\"] {\n        position: absolute;\n        opacity: 0;\n        width: 50px;\n    height: 20px;\n    }\n\n    \n    .tpl-switch input[type=\"checkbox\"].ios-switch + div {\n        vertical-align: middle;\n        width: 40px;\n        height: 20px;\n\n        border-radius: 999px;\n        background-color: rgba(0, 0, 0, 0.1);\n        -webkit-transition-duration: .4s;\n        -webkit-transition-property: background-color, box-shadow;\n\n        margin-top: 6px;\n    }\n\n    \n    .tpl-switch input[type=\"checkbox\"].ios-switch:checked + div {\n        width: 40px;\n        background-position: 0 0;\n        background-color: #36c6d3;\n\n\n    }\n\n    \n    .tpl-switch input[type=\"checkbox\"].tinyswitch.ios-switch + div {\n        width: 34px;\n        height: 18px;\n    }\n\n    \n    .tpl-switch input[type=\"checkbox\"].bigswitch.ios-switch + div {\n        width: 50px;\n        height: 25px;\n    }\n\n    \n    .tpl-switch input[type=\"checkbox\"].green.ios-switch:checked + div {\n        background-color: #00e359;\n        border: 1px solid rgba(0, 162, 63, 1);\n        box-shadow: inset 0 0 0 10px rgba(0, 227, 89, 1);\n    }\n\n    \n    .tpl-switch input[type=\"checkbox\"].ios-switch + div > div {\n        float: left;\n        width: 18px;\n        height: 18px;\n        border-radius: inherit;\n        background: #ffffff;\n        -webkit-transition-timing-function: cubic-bezier(.54, 1.85, .5, 1);\n        -webkit-transition-duration: 0.4s;\n        -webkit-transition-property: transform, background-color, box-shadow;\n        -moz-transition-timing-function: cubic-bezier(.54, 1.85, .5, 1);\n        -moz-transition-duration: 0.4s;\n        -moz-transition-property: transform, background-color;\n  \n        pointer-events: none;\n        margin-top: 1px;\n        margin-left: 1px;\n    }\n\n    \n    .tpl-switch input[type=\"checkbox\"].ios-switch:checked + div > div {\n        -webkit-transform: translate3d(20px, 0, 0);\n        -moz-transform: translate3d(20px, 0, 0);\n        background-color: #ffffff;\n  \n    }\n\n    \n    .tpl-switch input[type=\"checkbox\"].tinyswitch.ios-switch + div > div {\n        width: 16px;\n        height: 16px;\n        margin-top: 1px;\n    }\n\n    \n    .tpl-switch input[type=\"checkbox\"].tinyswitch.ios-switch:checked + div > div {\n        -webkit-transform: translate3d(16px, 0, 0);\n        -moz-transform: translate3d(16px, 0, 0);\n        box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.3), 0px 0px 0 1px rgba(8, 80, 172, 1);\n    }\n\n    \n    .tpl-switch input[type=\"checkbox\"].bigswitch.ios-switch + div > div {\n        width: 23px;\n        height: 23px;\n        margin-top: 1px;\n    }\n\n    \n    .tpl-switch input[type=\"checkbox\"].bigswitch.ios-switch:checked + div > div {\n        -webkit-transform: translate3d(25px, 0, 0);\n        -moz-transform: translate3d(16px, 0, 0);\n   \n    }\n\n    \n    .tpl-switch input[type=\"checkbox\"].green.ios-switch:checked + div > div {\n        box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(0, 162, 63, 1);\n    }\n\n\n\n.tpl-page-state {\n    width: 100%;\n}\n\n.tpl-page-state-title {\n    font-size: 40px;\n    font-weight: bold;\n}\n\n.tpl-page-state-content {\n    padding: 10px 0;\n}\n\n.tpl-login {\n   width: 100%; \n}\n\n.tpl-login-logo {\n    max-width: 159px;\n    height: 205px;\n    margin: 0 auto;\n    margin-bottom: 20px;\n}\n.tpl-login-title {\n    width: 100%;\n    font-size: 24px;\n}\n.tpl-login-content {\n    width: 300px;\n    margin: 12% auto 0;\n}\n.tpl-login-remember-me {\n    color: #B3B3B3;\n    font-size: 14px;\n\n        label {\n            position: relative;\n            top: -2px;\n        }\n}\n.tpl-login-content-info {\n    color: #B3B3B3;\n    font-size: 14px;\n}\n\n.tpl-pagination {\n\n}\n\n.cl-p {\n    padding: 0!important;\n}\n.tpl-table-line-img {\n    max-width: 100px;\n    padding: 2px;\n}\n.tpl-table-list-select {\n        text-align:right;\n    }\n.fc-button-group, .fc button {\n    display: block;\n}\n\n.theme-white {\n\n    .sidebar-nav-sub {\n        .sidebar-nav-link-logo {\n            margin-left: 10px;\n        }\n    }\n    .tpl-header-search-box:hover, .tpl-header-search-box:active\n    .tpl-error-title {\n\n        color: #848c90;\n    }\n    .tpl-error-title-info {\n        line-height: 30px;\n    font-size: 21px;\n    margin-top: 20px;\n            text-align: center;\n            color: #dce2ec;\n    }\n    .tpl-error-btn {\n        background: #03a9f3;\n    border: 1px solid #03a9f3;\n    border-radius: 30px;\n    padding: 6px 20px 8px;\n    }\n    .tpl-error-content {\n        margin-top: 20px;\n        margin-bottom: 20px;\n        font-size: 16px;\n        text-align: center;\n        color: #96a2b4;\n    }\n.tpl-calendar-box {\n        background: #fff;\n        border-radius: 4px;\n        padding: 20px;\n        .fc-event {\n            border-radius: 0;\n            background: #03a9f3;\n            border: 1px solid #14b0f6;\n        }\n        .fc-axis {\n            color: #868E8E;\n        }\n        .fc-unthemed .fc-today {\n            background: #eee;\n        }\n        .fc-more {\n            color: #868E8E;\n        }\n\n        .fc th.fc-widget-header {\n                background: #32c5d2!important;\n\n    color: #ffffff;\n    font-size: 14px;\n    line-height: 20px;\n    padding: 7px 0px;\n    text-transform: uppercase;\n    border:none!important;\n    a {\n        color: #fff;\n    }\n        }\n \n        .fc-center {\n            h2 {\n                color:#868E8E;\n            }\n        }\n        .fc-state-default {\n            background-image: none;\n            background: #fff;\n            font-size: 14px;\n            color: #868E8E;\n}\n        .fc th, .fc td, .fc hr, .fc thead, .fc tbody, .fc-row {\n            // background: rgba(0, 0, 0, 0)!important;\n                border-color: #eee!important;\n        }\n        .fc-day-number {\n            color: #868E8E;\n            padding-right: 6px;\n        }\n        .fc th {\n            color: #868E8E;\n            font-weight: normal;\n            font-size: 14px;\n            padding: 6px 0;\n        }\n    }\n\n    .tpl-login-logo {\n        background: url(../img/logoa.png) center no-repeat;\n        \n    }\n    .sub-active {\n\n        color:#23abf0!important;\n    }\n.tpl-table-line-img {\n    border: 1px solid #ddd;\n}\n.tpl-pagination .am-disabled a , .tpl-pagination li a {\n    color: #23abf0;\n    border-radius: 3px;\n    padding: 6px 12px;\n}\n\n.tpl-pagination .am-active a{\n    background: #23abf0;color: #fff;\n    border: 1px solid #23abf0;\n    padding: 6px 12px;\n}\n\n   \n.tpl-login-btn {\n    background-color:#32c5d2;\n    border: none;\n    padding: 10px 16px;\n    font-size: 14px;\n    line-height: 14px;\n    outline: none;\n\n    &:hover,&:active {\n        background: #22b2e1;\n        color:#fff;\n    }\n\n}\n.tpl-login-title {\n      color: #697882;\n    strong {\n        color: #39bae4;\n    }\n}\n   .tpl-login-content{\n       width: 500px;\n    padding: 40px 40px 25px;\n    background-color: #fff;\n    border-radius: 4px;\n   }\n    \n  .tpl-form-line-form , .tpl-form-border-form {\n        padding-top: 20px;\n  }\n\n\n.tpl-form-border-form input[type=number]:focus, .tpl-form-border-form input[type=search]:focus, .tpl-form-border-form input[type=text]:focus, .tpl-form-border-form input[type=password]:focus, .tpl-form-border-form input[type=datetime]:focus, .tpl-form-border-form input[type=datetime-local]:focus, .tpl-form-border-form input[type=date]:focus, .tpl-form-border-form input[type=month]:focus, .tpl-form-border-form input[type=time]:focus, .tpl-form-border-form input[type=week]:focus, .tpl-form-border-form input[type=email]:focus, .tpl-form-border-form input[type=url]:focus, .tpl-form-border-form input[type=tel]:focus, .tpl-form-border-form input[type=color]:focus, .tpl-form-border-form select:focus, .tpl-form-border-form textarea:focus, .am-form-field:focus{\n          -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n.tpl-form-border-form input[type=number], .tpl-form-border-form input[type=search], .tpl-form-border-form input[type=text], .tpl-form-border-form input[type=password], .tpl-form-border-form input[type=datetime], .tpl-form-border-form input[type=datetime-local], .tpl-form-border-form input[type=date], .tpl-form-border-form input[type=month], .tpl-form-border-form input[type=time], .tpl-form-border-form input[type=week], .tpl-form-border-form input[type=email], .tpl-form-border-form input[type=url], .tpl-form-border-form input[type=tel], .tpl-form-border-form input[type=color], .tpl-form-border-form select, .tpl-form-border-form textarea, .am-form-field {\n        display: block;\n    width: 100%;\n\n    padding: 6px 12px;\n    font-size: 14px;\n    line-height: 1.42857;\n    color: #4d6b8a;\n    background-color: #fff;\n    background-image: none;\n    border: 1px solid #c2cad8;\n    border-radius: 4px;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);\n    box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);\n    -webkit-transition: border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;\n    -o-transition: border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;\n    transition: border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;\n    background: 0 0;\n    border: 0;\n    border: 1px solid #c2cad8;\n    -webkit-border-radius: 0;\n    -moz-border-radius: 0;\n    -ms-border-radius: 0;\n    text-indent: .5em;\n    -o-border-radius: 0;\n    border-radius: 0;\n    color: #555;\n    box-shadow: none;\n    padding-left: 0;\n    padding-right: 0;\n    font-size: 14px;\n}\n\n.tpl-form-border-form .am-checkbox, .tpl-form-border-form .am-checkbox-inline, .tpl-form-border-form .am-form-label, .tpl-form-border-form .am-radio, .tpl-form-border-form .am-radio-inline{\n    margin-top: 0;\n    margin-bottom: 0;\n\n}\n\n.tpl-form-border-form .am-form-group:after {\n    clear: both;\n}\n.tpl-form-border-form .am-form-group:after, .tpl-form-border-form .am-form-group:before {\ncontent: \" \";\n    display: table;\n\n}\n.tpl-form-border-form  .am-form-label{    \n    padding-top: 5px;\nfont-size: 16px;\ncolor: #888;\nfont-weight: inherit;\ntext-align: right;\n}\n.tpl-form-border-form  .am-form-group {\n    /*padding: 20px 0;*/\n\n}\n.tpl-form-border-form  .am-form-label .tpl-form-line-small-title {\n    color: #999;\n    font-size: 12px;\n}\n\n  .tpl-form-line-form input[type=number]:focus, .tpl-form-line-form input[type=search]:focus, .tpl-form-line-form input[type=text]:focus, .tpl-form-line-form input[type=password]:focus, .tpl-form-line-form input[type=datetime]:focus, .tpl-form-line-form input[type=datetime-local]:focus, .tpl-form-line-form input[type=date]:focus, .tpl-form-line-form input[type=month]:focus, .tpl-form-line-form input[type=time]:focus, .tpl-form-line-form input[type=week]:focus, .tpl-form-line-form input[type=email]:focus, .tpl-form-line-form input[type=url]:focus, .tpl-form-line-form input[type=tel]:focus, .tpl-form-line-form input[type=color]:focus, .tpl-form-line-form select:focus, .tpl-form-line-form textarea:focus, .am-form-field:focus{\n          -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n.tpl-form-line-form input[type=number], .tpl-form-line-form input[type=search], .tpl-form-line-form input[type=text], .tpl-form-line-form input[type=password], .tpl-form-line-form input[type=datetime], .tpl-form-line-form input[type=datetime-local], .tpl-form-line-form input[type=date], .tpl-form-line-form input[type=month], .tpl-form-line-form input[type=time], .tpl-form-line-form input[type=week], .tpl-form-line-form input[type=email], .tpl-form-line-form input[type=url], .tpl-form-line-form input[type=tel], .tpl-form-line-form input[type=color], .tpl-form-line-form select, .tpl-form-line-form textarea, .am-form-field {\n        display: block;\n    width: 100%;\n\n    padding: 6px 12px;\n    font-size: 14px;\n    line-height: 1.42857;\n    color: #4d6b8a;\n    background-color: #fff;\n    background-image: none;\n    border: 1px solid #c2cad8;\n    border-radius: 4px;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);\n    box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);\n    -webkit-transition: border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;\n    -o-transition: border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;\n    transition: border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;\n    background: 0 0;\n    border: 0;\n    border-bottom: 1px solid #c2cad8;\n    -webkit-border-radius: 0;\n    -moz-border-radius: 0;\n    -ms-border-radius: 0;\n    -o-border-radius: 0;\n    border-radius: 0;\n    color: #555;\n    box-shadow: none;\n    padding-left: 0;\n    padding-right: 0;\n    font-size: 14px;\n}\n\n.tpl-form-line-form .am-checkbox, .tpl-form-line-form .am-checkbox-inline, .tpl-form-line-form .am-form-label, .tpl-form-line-form .am-radio, .tpl-form-line-form .am-radio-inline{\n    margin-top: 0;\n    margin-bottom: 0;\n\n}\n\n.tpl-form-line-form .am-form-group:after {\n    clear: both;\n}\n.tpl-form-line-form .am-form-group:after, .tpl-form-line-form .am-form-group:before {\ncontent: \" \";\n    display: table;\n\n}\n.tpl-form-line-form  .am-form-label{    \n    padding-top: 5px;\nfont-size: 16px;\ncolor: #888;\nfont-weight: inherit;\ntext-align: right;\n}\n.tpl-form-line-form  .am-form-group {\n    /*padding: 20px 0;*/\n\n}\n.tpl-form-line-form  .am-form-label .tpl-form-line-small-title {\n    color: #999;\n    font-size: 12px;\n}\n\n    .tpl-table-black-operation {\n    a {\n        border: 1px solid #36c6d3;\n        color:#36c6d3;\n        &:hover {\n            background: #36c6d3;\n            color:#fff;\n        }\n    }\n    a.tpl-table-black-operation-del {\n        border: 1px solid #e7505a;\n        color:#e7505a;\n        &:hover {\n            background: #e7505a;\n            color:#fff;\n        }\n    }\n}\n    .tpl-amendment-echarts {\n            left: -17px;\n    }\n   .tpl-user-card {\n        border: 1px solid #3598dc;\n        border-top: 2px solid #3598dc;\n        background: #3598dc;\n        color: #ffffff;\n        border-radius: 4px;\n    }\n          .tpl-user-card-title {\n        font-size: 26px;\n        margin-top: 0;\n        font-weight: 300;\n        margin-top: 25px;\n        margin-bottom: 10px;\n    }\n    .achievement-subheading {\n        font-size: 12px;\n        margin-top: 0;\n        margin-bottom: 15px;\n    }\n     .achievement-image {\n             border-radius: 50%;\n    margin-bottom: 22px;\n     }\n     .achievement-description {\n             margin: 0;\n    font-size: 12px;\n     }\n\n           .tpl-table-black {\n            color: #838FA1;\n\n        thead>tr>th {\n            font-size: 14px;\n            padding: 6px;\n        }\n        tbody>tr>td {\n            font-size: 14px;\n            padding: 7px 6px;\n\n        }\n        tfoot>tr>th {\n            font-size: 14px;\n            padding: 6px 0;\n        }\n    }\n\n\n     .am-progress {\n          height: 12px;\n     }\n    .am-progress-title {\n        font-size: 14px;\n         margin-bottom: 8px;\n    }\n    .am-progress-title-more {\n\n    }\n      .widget-fluctuation-tpl-btn {\n       margin-top: 6px;\n       display: block;\n        color: #fff;\n        font-size: 12px;\n            padding: 8px 14px;\n            outline: none;\n    background-color: #e7505a;\n    border: 1px solid #e7505a;\n            &:hover {\n                background:transparent;\n                color:#e7505a;\n            }\n\n    }\n    .widget-fluctuation-description-text{\ncolor: #c5cacd;\n    }\n    background: #e9ecf3;\n    .widget-fluctuation-period-text {\n        color:#838FA1;\n    }\n.text-success {\n       color: #5eb95e;\n}\n    .widget-head {\n         border-bottom: 1px solid #eef1f5;\n}\n   .widget-function {\n       a {\n            color: #838FA1;\n        &:hover {\n            color:#a7bdcd;\n        }\n       }\n   \n    }\n    .widget  {\n        padding: 10px 20px 13px;\n        background-color: #fff;\n        border-radius: 4px;\n            color: #838FA1;\n            \n    }\n    .widget-title {\n        font-size: 16px;\n    }\n\n    .widget-primary {\n       \n        min-height: 174px;\n    border: 1px solid #32c5d2;\n    border-top: 2px solid #32c5d2;\n    background: #32c5d2;\n    color: #ffffff;\n        padding: 12px 17px;\n         padding-left: 22px;\n}\n.widget-statistic-body {\n\n}\n.widget-statistic-icon {\n    position: absolute;\n    z-index: 30;\n    right: 30px;\n    top: 24px;\n    font-size: 70px;\n    color: #46cad6;\n}\n.widget-statistic-description {\n    position: relative;\n    z-index: 35;\n    display: block;\n    font-size: 14px;\n    line-height: 14px;\n    padding-top: 8px;\n        color: #fff;\n}\n.widget-statistic-value {\n    position: relative;\n    z-index: 35;\n    font-weight: 300;\n    display: block;\n    color: #fff;\n    font-size: 46px;\n    line-height: 46px;\n    margin-bottom: 8px;\n}\n.widget-statistic-header {\n    padding-top: 18px;\n    color: #fff;\n}\n.widget-purple {\n        padding: 12px 17px;\n        border: 1px solid #8E44AD;\n    border-top: 2px solid #8E44AD;\n    background: #8E44AD;\n    color: #ffffff;\n        min-height: 174px;\n     .widget-statistic-icon {\n             color: #9956b5;\n     }\n    .widget-statistic-header {\n        color: #ded5e7;\n    }\n    .widget-statistic-description {\n            color: #ded5e7;\n    }\n}\n    .page-header-button {\n        opacity: .8;\n        border: 1px solid #32c5d2;\n        background: #32c5d2;\n        color:#fff;\n        &:hover {\n            opacity: 1;\n        }\n    }\n       .page-header-description {\n       color: #666;\n   }\n    .page-header-heading {\n        color: #666;\n    }\n    .container-fluid {\n    \n    }\n    ul.tpl-dropdown-content .tpl-dropdown-menu-messages-item .menu-messages-content .menu-messages-content-time {\n    color: #96a5aa;\n    }\n    ul.tpl-dropdown-content {\n        background: #fff;\n        border: 1px solid #ddd;\n    .tpl-dropdown-menu-notifications-item , .tpl-dropdown-menu-messages-item {\n        border-bottom: 1px solid #eee;\n        color:#999;\n            \n            &:hover{\n                    background-color: #f5f5f5;\n            }\n        .tpl-dropdown-menu-notifications-time {\n            color: #999;\n        }\n    }\n        .tpl-dropdown-menu-messages-item:hover {\n                background-color: #f5f5f5;\n        }\n\n        .tpl-dropdown-menu-notifications-title {\n            color:#999;\n        }\n\n        \n    }\n    .sidebar-nav-link {\n        a {\n            border-left: #fff 3px solid;\n        }\n        a:hover {\n\n            background: #f2f6f9;\n    color: #868E8E;\n    border-left: #3bb4f2 3px solid;\n        }\n    }\n\n    .sidebar-nav-link a.active {\n            background: #f2f6f9;\n            color:  #868E8E;\n            border-left: #3bb4f2 3px solid;\n    }\n   .sidebar-nav-heading {\n       color: #999;\n       border-bottom: 1px solid #eee;\n   }\n    .tpl-sidebar-user-panel {\n        background: #fff;\n        border-bottom: 1px solid #eee;\n    }\n.tpl-content-wrapper {\n       background: #e9ecf3;\n   }\n    .tpl-header-fluid {\n    background: #fff;\n    border-top: 1px solid #eee;\n}\n    .tpl-header-logo {\n     background: #fff;\n     border-bottom: 1px solid #eee;\n}\n\n.tpl-header-switch-button {\n    background: #fff;\n    border-right: 1px solid #eee;\n    border-left: 1px solid #eee;\n    &:hover {\n        background: #fff;\n        color: #999;\n    }\n}\n     .tpl-header-navbar {\n        a {\n            color:#999;\n\n            &:hover {\n                color: #999;\n            }\n        }\n    }\n    .left-sidebar {\n        background: #fff;\n    }\n\n  .widget-color-green {\n        border: 1px solid #32c5d2;\n    border-top: 2px solid #32c5d2;\n    background: #32c5d2;\n    color: #ffffff;\n    .widget-fluctuation-period-text {\n        color:#fff;\n    }\n    .widget-head {\n        border-bottom: 1px solid #2bb8c4;\n    }\n    .widget-fluctuation-description-text {\n        color:#bbe7f6;\n    }\n    .widget-function {\n        a {\n            color:#42bde5;\n            &:hover {\n                color: #fff;\n            }\n        }\n    }\n    }\n\n\n\n}\n\n\n.theme-black {\n\n    .tpl-am-model-bd {\n        background: #424b4f;\n    }\n    .tpl-model-dialog {\n        background: #424b4f;\n    }\n     .tpl-error-title {\n        font-size: 210px;\n        line-height: 220px;\n        color: #868E8E;\n    }\n    .tpl-error-title-info {\n        line-height: 30px;\n    font-size: 21px;\n    margin-top: 20px;\n            text-align: center;\n            color: #868E8E;\n    }\n    .tpl-error-btn {\n        background: #03a9f3;\n    border: 1px solid #03a9f3;\n    border-radius: 30px;\n    padding: 6px 20px 8px;\n    }\n    .tpl-error-content {\n        margin-top: 20px;\n        margin-bottom: 20px;\n        font-size: 16px;\n        text-align: center;\n        color: #cfcfcf;\n    }\n    .tpl-calendar-box {\n        background: #424b4f;\n        padding: 20px;\n        .fc-button {\n            border-radius: 0;\n            box-shadow:0;\n        }\n        .fc-event {\n            border-radius: 0;\n            background: #03a9f3;\n        }\n        .fc-axis {\n            color: #fff;\n        }\n        .fc-unthemed .fc-today {\n            background: #3a4144;\n        }\n        .fc-more {\n            color: #fff;\n        }\n        .fc th.fc-widget-header {\n                background: #9675ce!important;\n    color: #ffffff;\n    font-size: 14px;\n    line-height: 20px;\n    padding: 7px 0px;\n    text-transform: uppercase;\n    border:none!important;\n    a {\n        color: #fff;\n    }\n        }\n \n        .fc-center {\n            h2 {\n                color:#fff;\n            }\n        }\n        .fc-state-default {\n            background-image: none;\n            background: #fff;\n            font-size: 14px;\n}\n        .fc th, .fc td, .fc hr, .fc thead, .fc tbody, .fc-row {\n            // background: rgba(0, 0, 0, 0)!important;\n                border-color: rgba(120, 130, 140, 0.4) !important;\n        }\n        .fc-day-number {\n            color: #868E8E;\n            padding-right: 6px;\n        }\n        .fc th {\n            color: #868E8E;\n            font-weight: normal;\n            font-size: 14px;\n            padding: 6px 0;\n        }\n    }\n   .tpl-login-logo {\n        background: url(../img/logob.png) center no-repeat;\n        \n    }\n    .tpl-table-line-img {\n    max-width: 100px;\n    padding: 2px;\nborder: none;\n}\n   .tpl-table-list-field {\n       border: none;\n   }\n    .tpl-table-list-select {\n   \n        .am-dropdown-content {\n            color:#888;\n        }\n        .am-selected-btn {\n                border:1px solid rgba(255, 255, 255, 0.2);\n                color:#fff;\n        }\n\n        .am-btn-default.am-active, .am-btn-default:active, .am-dropdown.am-active .am-btn-default.am-dropdown-toggle {\n            border:1px solid rgba(255, 255, 255, 0.2);\n                color:#fff;\n                background: #5d6468;\n        }\n    }\n.tpl-pagination .am-disabled a , .tpl-pagination li a {\n    color: #fff;\n    padding: 6px 12px;\n    background: #3f4649;\n    border: none;\n}\n\n.tpl-pagination .am-active a{\n    background: #167fa1;color: #fff;\n    border: 1px solid #167fa1;\n    padding: 6px 12px;\n}\n\n.tpl-login-btn {\n    border: 1px solid #b5b5b5;\n    background-color: rgba(0, 0, 0, 0);\n    padding: 10px 16px;\n    font-size: 14px;\n    line-height: 14px;\n    color:#b5b5b5;\n\n    &:hover,&:active {\n        background: #b5b5b5;\n        color:#fff;\n    }\n\n}\n.tpl-login-title {\n    color:#fff;\n    strong {\n        color: #39bae4;\n    }\n}\n\n\n\n\n .tpl-form-line-form , .tpl-form-border-form {\n        padding-top: 20px;\n\n        .am-btn-default {\n            color:#fff;\n            border: 1px solid rgba(255, 255, 255, 0.2);\n           \n        }\n         .am-selected-text {\n                color:#888;\n            }\n  }\n  .tpl-form-border-form input[type=number]:focus, .tpl-form-border-form input[type=search]:focus, .tpl-form-border-form input[type=text]:focus, .tpl-form-border-form input[type=password]:focus, .tpl-form-border-form input[type=datetime]:focus, .tpl-form-border-form input[type=datetime-local]:focus, .tpl-form-border-form input[type=date]:focus, .tpl-form-border-form input[type=month]:focus, .tpl-form-border-form input[type=time]:focus, .tpl-form-border-form input[type=week]:focus, .tpl-form-border-form input[type=email]:focus, .tpl-form-border-form input[type=url]:focus, .tpl-form-border-form input[type=tel]:focus, .tpl-form-border-form input[type=color]:focus, .tpl-form-border-form select:focus, .tpl-form-border-form textarea:focus, .am-form-field:focus{\n          -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n.tpl-form-border-form input[type=number], .tpl-form-border-form input[type=search], .tpl-form-border-form input[type=text], .tpl-form-border-form input[type=password], .tpl-form-border-form input[type=datetime], .tpl-form-border-form input[type=datetime-local], .tpl-form-border-form input[type=date], .tpl-form-border-form input[type=month], .tpl-form-border-form input[type=time], .tpl-form-border-form input[type=week], .tpl-form-border-form input[type=email], .tpl-form-border-form input[type=url], .tpl-form-border-form input[type=tel], .tpl-form-border-form input[type=color], .tpl-form-border-form select, .tpl-form-border-form textarea, .am-form-field {\n        display: block;\n    width: 100%;\n\n    padding: 6px 12px;\n    font-size: 14px;\n    line-height: 1.42857;\n    color: #4d6b8a;\n    background-color: #fff;\n    background-image: none;\n    border: 1px solid #c2cad8;\n    border-radius: 4px;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);\n    box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);\n    -webkit-transition: border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;\n    -o-transition: border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;\n    transition: border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;\n    background: 0 0;\n    border: 0;\n    text-indent: .5em;\n    border: 1px solid rgba(255, 255, 255, 0.2);\n    -webkit-border-radius: 0;\n    -moz-border-radius: 0;\n    -ms-border-radius: 0;\n    -o-border-radius: 0;\n    border-radius: 0;\n    color: #fff;\n    box-shadow: none;\n    padding-left: 0;\n    padding-right: 0;\n    font-size: 14px;\n}\n\n.tpl-form-border-form .am-checkbox, .tpl-form-border-form .am-checkbox-inline, .tpl-form-border-form .am-form-label, .tpl-form-border-form .am-radio, .tpl-form-border-form .am-radio-inline{\n    margin-top: 0;\n    margin-bottom: 0;\n\n}\n\n.tpl-form-border-form .am-form-group:after {\n    clear: both;\n}\n.tpl-form-border-form .am-form-group:after, .tpl-form-border-form .am-form-group:before {\ncontent: \" \";\n    display: table;\n\n}\n.tpl-form-border-form  .am-form-label{    \n    padding-top: 5px;\nfont-size: 16px;\ncolor: #fff;\nfont-weight: inherit;\ntext-align: right;\n}\n.tpl-form-border-form  .am-form-group {\n    /*padding: 20px 0;*/\n\n}\n.tpl-form-border-form  .am-form-label .tpl-form-line-small-title {\n    color: #999;\n    font-size: 12px;\n}\n\n\n\n\n\n\n  .tpl-form-line-form input[type=number]:focus, .tpl-form-line-form input[type=search]:focus, .tpl-form-line-form input[type=text]:focus, .tpl-form-line-form input[type=password]:focus, .tpl-form-line-form input[type=datetime]:focus, .tpl-form-line-form input[type=datetime-local]:focus, .tpl-form-line-form input[type=date]:focus, .tpl-form-line-form input[type=month]:focus, .tpl-form-line-form input[type=time]:focus, .tpl-form-line-form input[type=week]:focus, .tpl-form-line-form input[type=email]:focus, .tpl-form-line-form input[type=url]:focus, .tpl-form-line-form input[type=tel]:focus, .tpl-form-line-form input[type=color]:focus, .tpl-form-line-form select:focus, .tpl-form-line-form textarea:focus, .am-form-field:focus{\n          -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n.tpl-form-line-form input[type=number], .tpl-form-line-form input[type=search], .tpl-form-line-form input[type=text], .tpl-form-line-form input[type=password], .tpl-form-line-form input[type=datetime], .tpl-form-line-form input[type=datetime-local], .tpl-form-line-form input[type=date], .tpl-form-line-form input[type=month], .tpl-form-line-form input[type=time], .tpl-form-line-form input[type=week], .tpl-form-line-form input[type=email], .tpl-form-line-form input[type=url], .tpl-form-line-form input[type=tel], .tpl-form-line-form input[type=color], .tpl-form-line-form select, .tpl-form-line-form textarea, .am-form-field {\n        display: block;\n    width: 100%;\n\n    padding: 6px 12px;\n    font-size: 14px;\n    line-height: 1.42857;\n    color: #4d6b8a;\n    background-color: #fff;\n    background-image: none;\n    border: 1px solid #c2cad8;\n    border-radius: 4px;\n    -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);\n    box-shadow: inset 0 1px 1px rgba(0,0,0,0.075);\n    -webkit-transition: border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;\n    -o-transition: border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;\n    transition: border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;\n    background: 0 0;\n    border: 0;\n    border-bottom: 1px solid rgba(255, 255, 255, 0.2);\n    -webkit-border-radius: 0;\n    -moz-border-radius: 0;\n    -ms-border-radius: 0;\n    -o-border-radius: 0;\n    border-radius: 0;\n    color: #fff;\n    box-shadow: none;\n    padding-left: 0;\n    padding-right: 0;\n    font-size: 14px;\n}\n\n.tpl-form-line-form .am-checkbox, .tpl-form-line-form .am-checkbox-inline, .tpl-form-line-form .am-form-label, .tpl-form-line-form .am-radio, .tpl-form-line-form .am-radio-inline{\n    margin-top: 0;\n    margin-bottom: 0;\n\n}\n\n.tpl-form-line-form .am-form-group:after {\n    clear: both;\n}\n.tpl-form-line-form .am-form-group:after, .tpl-form-line-form .am-form-group:before {\ncontent: \" \";\n    display: table;\n\n}\n.tpl-form-line-form  .am-form-label{    \n    padding-top: 5px;\nfont-size: 16px;\ncolor: #fff;\nfont-weight: inherit;\ntext-align: right;\n}\n\n\n\n.tpl-form-line-form  .am-form-group {\n    /*padding: 20px 0;*/\n\n}\n.tpl-form-line-form  .am-form-label .tpl-form-line-small-title {\n    color: #999;\n    font-size: 12px;\n}\n   \n   background-color: #282d2f;\n   \n .tpl-table-black-operation {\n    a {\n        border: 1px solid #7b878d;\n        color:#7b878d;\n        &:hover {\n            background: #7b878d;\n            color:#fff;\n        }\n    }\n    a.tpl-table-black-operation-del {\n        border: 1px solid #f35842;\n        color:#f35842;\n        &:hover {\n            background: #f35842;\n            color:#fff;\n        }\n    }\n}\n    .am-table-bordered {\n        border: 1px solid #666d70;\n    }\n    .am-table-bordered>tbody>tr>td, .am-table-bordered>tbody>tr>th, .am-table-bordered>tfoot>tr>td, .am-table-bordered>tfoot>tr>th, .am-table-bordered>thead>tr>td, .am-table-bordered>thead>tr>th {\n        border: 1px solid #666d70;\n    }\n\n    .am-table-bordered>thead+tbody>tr:first-child>td, .am-table-bordered>thead+tbody>tr:first-child>th {\n         border: 1px solid #666d70;\n    }\n\n    .am-table-striped>tbody>tr:nth-child(odd)>td, .am-table-striped>tbody>tr:nth-child(odd)>th {\n        background-color: #5d6468;\n    }\n    .tpl-table-black {\n        color:#fff;\n\n        thead>tr>th {\n            font-size: 14px;\n            padding: 6px;\n            border-bottom: 1px solid #666d70;\n        }\n        tbody>tr>td {\n            font-size: 14px;\n            padding: 7px 6px;\n                border-top: 1px solid #666d70;\n        }\n        tfoot>tr>th {\n            font-size: 14px;\n            padding: 6px 0;\n        }\n    }\n   .tpl-user-card {\n        border: 1px solid #11627d;\n        border-top: 2px solid #105f79;\n        background: #1786aa;\n        color: #ffffff;\n    }\n          .tpl-user-card-title {\n        font-size: 26px;\n        margin-top: 0;\n        font-weight: 300;\n        margin-top: 25px;\n        margin-bottom: 10px;\n    }\n    .achievement-subheading {\n        font-size: 12px;\n        margin-top: 0;\n        margin-bottom: 15px;\n    }\n     .achievement-image {\n             border-radius: 50%;\n    margin-bottom: 22px;\n     }\n     .achievement-description {\n             margin: 0;\n    font-size: 12px;\n     }\n\n\n\n    .am-progress {\n        height: 12px;\n        margin-bottom: 14px;\n              background: rgba(0, 0, 0, 0.15);\n    }\n   .am-progress-title {\n        font-size: 14px;\n        margin-bottom: 8px;\n    }\n    .am-progress-title-more {\n            color: #a1a8ab;\n    }\n   .widget-fluctuation-tpl-btn {\n       margin-top: 6px;\n       display: block;\n        color: #fff;\n        font-size: 12px;\n            padding: 5px 10px;\n            outline: none;\n    background-color: rgba(255, 255, 255, 0);\n    border: 1px solid #fff;\n            &:hover {\n                background: #fff;\n                color:#4b5357;\n            }\n\n    }\n.widget-fluctuation-description-text{\ncolor: #c5cacd;\n    }\n\n   .text-success {\n    color: #08ed72;\n}\n.widget-fluctuation-period-text {\n      color:#fff;   \n    }\n\n    .widget-head {\n    border-bottom: 1px solid #3f4649;\n}\n   .widget-function {\n       a {\n            color:#7b878d;\n        &:hover {\n            color:#fff;\n        }\n       }\n   \n    }\n    .widget  {\n         border: 1px solid #33393c;\n    border-top: 2px solid #313639;\n    background: #4b5357;\n    color: #ffffff;\n    }\n      .widget-primary {\n    border: 1px solid #11627d;\n    border-top: 2px solid #105f79;\n    background: #1786aa;\n    color: #ffffff;\n        padding: 12px 17px;\n}\n.widget-statistic-body {\n\n}\n.widget-statistic-icon {\n    position: absolute;\n    z-index: 30;\n    right: 30px;\n    top: 0px;\n    font-size: 70px;\n    color: #1b9eca;\n}\n.widget-statistic-description {\n    position: relative;\n    z-index: 35;\n    display: block;\n    font-size: 14px;\n    line-height: 14px;\n    padding-top: 8px;\n        color: #9cdcf2;\n}\n.widget-statistic-value {\n    position: relative;\n    z-index: 35;\n    font-weight: 300;\n    display: block;\n    color: #fff;\n    font-size: 46px;\n    line-height: 46px;\n    margin-bottom: 8px;\n}\n.widget-statistic-header {\n    color: #9cdcf2;\n}\n\n.widget-purple {\n        padding: 12px 17px;\n        border: 1px solid #5e4578;\n    border-top: 2px solid #5c4375;\n    background: #785799;\n    color: #ffffff;\n     .widget-statistic-icon {\n             color: #8a6aaa;\n     }\n    .widget-statistic-header {\n        color: #ded5e7;\n    }\n    .widget-statistic-description {\n            color: #ded5e7;\n    }\n}\n   .page-header-description {\n       color: #e6e6e6;\n   }\n   .page-header-heading {\n        color: #666;\n    }\n    .container-fluid {\n        background: #424b4f;\n    }\n   .page-header-heading {\n       color: #fff;\n   }\n   .sidebar-nav-heading {\n       color:#fff;\n   }\n   .tpl-sidebar-user-panel {\n    background: #1f2224;\n    border-bottom: 1px solid #1f2224;\n}\n   .tpl-content-wrapper {\n       background: #3a4144;\n   }\n       .tpl-header-fluid {\n    background: #2f3638;\n\n}\n\n    .sidebar-nav-link {\n        a.active {\n            background: #232829;\n        }\n        a:hover {\n\n         background: #232829;\n        }\n    }\n\n.tpl-header-switch-button {\n    background: #2f3638;\n    border-right: 1px solid #282d2f;\n    &:hover {\n        background: #282d2f;\n        color: #fff;\n    }\n}\n        .tpl-header-navbar {\n        a {\n            color:#cfcfcf;\n\n            &:hover {\n                color: #fff;\n            }\n        }\n    } \n    .left-sidebar {\n        padding-top: 56px;\n        background: #282d2f;\n    }\n\n    .widget-color-green {\n        border: 1px solid #11627d;\n    border-top: 2px solid #105f79;\n    background: #1786aa;\n    color: #ffffff;\n    .widget-head {\n        border-bottom: 1px solid #147494;\n    }\n    .widget-fluctuation-description-text {\n        color:#bbe7f6;\n    }\n    .widget-function {\n        a {\n            color:#42bde5;\n            &:hover {\n                color: #fff;\n            }\n        }\n    }\n    }\n}\n\n\n\n@media screen and (max-width: 1024px) {\n    .tpl-index-settings-button {\n        display: none;\n    }\n\n    .theme-black .left-sidebar {\n        padding-top: 111px;\n    }\n    .left-sidebar {\n        padding-top: 111px;\n    }\n    .tpl-content-wrapper {\n        margin-left: 0\n    }\n    .tpl-header-logo {\n        float:none;\n        width: 100%;\n    }\n    .tpl-header-navbar-welcome {\n        display: none;\n    }\n\n    .tpl-sidebar-user-panel {\n        border-top: 1px solid #eee;\n    }\n    .tpl-header-fluid {\n        border-top: none;\n        margin-left: 0;\n    }\n\n    .theme-white .tpl-header-fluid {\n        border-top: none;\n    }\n    .theme-black .tpl-sidebar-user-panel {\n        border-top: 1px solid #1f2224;\n    }\n}\n\n@media screen and (min-width: 641px) {\n     [class*=am-u-] {\n        padding-left: 10px;\n        padding-right: 10px;\n}\n}\n@media screen and (max-width: 641px) {\n\n     .theme-white , .theme-black {\n         .tpl-error-title {\n        font-size: 130px;\n        line-height: 140px;\n\n    }\n     }\n     .theme-white {\n         \n         .tpl-login-title {\n             font-size: 20px;\n         }\n        .tpl-login-content{\n            width: 86%;\n                padding: 22px 30px 25px;\n        }\n    }\n\n\n  \n    .tpl-header-search {\n        display: none;\n    }\n    ul.tpl-dropdown-content {\n        position: fixed;\n        width: 100%;\n        left: 0;\n        top: 112px;\n        right: 0;\n    }\n}"
  },
  {
    "path": "src/main/resources/static/assets/css/calculator.css",
    "content": "/*@charset \"utf-8\";*/\n/*body, ul, dl, dd, dt, ol, li, p, h1, h2, h3, h4, h5, h6, textarea, form, select, fieldset, table, td, div, input {margin:0;padding:0;-webkit-text-size-adjust: none}*/\n/*h1, h2, h3, h4, h5, h6{font-size:12px;font-weight:normal}*/\n/*body>div{margin:0 auto}*/\n/*div {text-align:left}*/\n/*a img {border:0}*/\n/*body { color: #333; text-align: center; font: 12px \"微软雅黑\"; }*/\n/*ul, ol, li {list-style-type:none;vertical-align:0}*/\n/*a {outline-style:none;color:#535353;text-decoration:none}*/\n/*a:hover { color: #D40000; text-decoration: none}*/\n/*.clear{height:0; overflow:hidden; clear:both}*/\n\n#calcuator{ width:200px; height:245px; padding:10px; border:1px solid #e5e5e5; background:#f8f8f8; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius:3px; box-shadow:0px 0px 10px #f2f2f2; -moz-box-shadow:0px 0px 10px #f2f2f2; -webkit-box-shadow:0px 0px 10px #f2f2f2; margin: 0px auto; }\n#calcuator #input-box{ margin:0; width:187px; padding:9px 5px; height:14px;border:1px solid #e5e5e5; border-radius:3px; -webkit-border-radius:3px; -moz-border-radius:3px; background:#FFF; text-align:right; line-height:14px; font-size:12px; font-family:Verdana, Geneva, sans-serif; color:#666; outline:none;  text-transform:uppercase;}\n#calcuator #btn-list{ width:200px; overflow:hidden;}\n#calcuator #btn-list .btn-radius{ border-radius:2px; -webkit-border-radius:2px; -moz-border-radius:2px; border:1px solid #e5e5e5; background:-webkit-gradient(linear, 0 0, 0 100%, from(#f7f7f7), to(#ebebeb)); background:-moz-linear-gradient(top, #f7f7f7,#ebebeb);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#f7f7f7,endColorstr=#ebebeb,grandientType=1); line-height:29px; text-align:center; text-shadow:0px 1px 1px #FFF; font-weight:bold; font-family:Verdana, Geneva, sans-serif; color:#666; float:left; margin-left:11px; margin-top:11px; font-size:12px; cursor:pointer;}\n#calcuator #btn-list .btn-radius:active{ background:#ffffff;}\n#calcuator #btn-list .clear-marginleft{ margin-left:0;}\n#calcuator #btn-list .font-14{ font-size:14px;}\n#calcuator #btn-list .color-red{ color:#ff5050}\n#calcuator #btn-list .color-blue{ color:#00b4ff}\n#calcuator #btn-list .btn-30{ width:29px; height:29px;}\n#calcuator #btn-list .btn-70{ width:70px; height:29px;}"
  },
  {
    "path": "src/main/resources/static/assets/css/flipclock.css",
    "content": "/* Get the bourbon mixin from http://bourbon.io */\n/* Reset */\n.flip-clock-wrapper * {\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    -ms-box-sizing: border-box;\n    -o-box-sizing: border-box;\n    box-sizing: border-box;\n    -webkit-backface-visibility: hidden;\n    -moz-backface-visibility: hidden;\n    -ms-backface-visibility: hidden;\n    -o-backface-visibility: hidden;\n    backface-visibility: hidden;\n}\n\n.flip-clock-wrapper a {\n  cursor: pointer;\n  text-decoration: none;\n  color: #ccc; }\n\n.flip-clock-wrapper a:hover {\n  color: #fff; }\n\n.flip-clock-wrapper ul {\n  list-style: none; }\n\n.flip-clock-wrapper.clearfix:before,\n.flip-clock-wrapper.clearfix:after {\n  content: \" \";\n  display: table; }\n\n.flip-clock-wrapper.clearfix:after {\n  clear: both; }\n\n.flip-clock-wrapper.clearfix {\n  *zoom: 1; }\n\n/* Main */\n.flip-clock-wrapper {\n  font: normal 11px \"Helvetica Neue\", Helvetica, sans-serif;\n  -webkit-user-select: none; }\n\n.flip-clock-meridium {\n  background: none !important;\n  box-shadow: 0 0 0 !important;\n  font-size: 36px !important; }\n\n.flip-clock-meridium a { color: #313333; }\n\n.flip-clock-wrapper {\n  text-align: center;\n  position: relative;\n  width: 100%;\n  margin: 1em;\n}\n\n.flip-clock-wrapper:before,\n.flip-clock-wrapper:after {\n    content: \" \"; /* 1 */\n    display: table; /* 2 */\n}\n.flip-clock-wrapper:after {\n    clear: both;\n}\n\n/* Skeleton */\n.flip-clock-wrapper ul {\n  position: relative;\n  float: left;\n  margin: 5px;\n  width: 60px;\n  height: 90px;\n  font-size: 80px;\n  font-weight: bold;\n  line-height: 87px;\n  border-radius: 6px;\n  background: #000;\n}\n\n.flip-clock-wrapper ul li {\n  z-index: 1;\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n  line-height: 87px;\n  text-decoration: none !important;\n}\n\n.flip-clock-wrapper ul li:first-child {\n  z-index: 2; }\n\n.flip-clock-wrapper ul li a {\n  display: block;\n  height: 100%;\n  -webkit-perspective: 200px;\n  -moz-perspective: 200px;\n  perspective: 200px;\n  margin: 0 !important;\n  overflow: visible !important;\n  cursor: default !important; }\n\n.flip-clock-wrapper ul li a div {\n  z-index: 1;\n  position: absolute;\n  left: 0;\n  width: 100%;\n  height: 50%;\n  font-size: 80px;\n  overflow: hidden; \n  outline: 1px solid transparent; }\n\n.flip-clock-wrapper ul li a div .shadow {\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  z-index: 2; }\n\n.flip-clock-wrapper ul li a div.up {\n  -webkit-transform-origin: 50% 100%;\n  -moz-transform-origin: 50% 100%;\n  -ms-transform-origin: 50% 100%;\n  -o-transform-origin: 50% 100%;\n  transform-origin: 50% 100%;\n  top: 0; }\n\n.flip-clock-wrapper ul li a div.up:after {\n  content: \"\";\n  position: absolute;\n  top: 44px;\n  left: 0;\n  z-index: 5;\n  width: 100%;\n  height: 3px;\n  background-color: #000;\n  background-color: rgba(0, 0, 0, 0.4); }\n\n.flip-clock-wrapper ul li a div.down {\n  -webkit-transform-origin: 50% 0;\n  -moz-transform-origin: 50% 0;\n  -ms-transform-origin: 50% 0;\n  -o-transform-origin: 50% 0;\n  transform-origin: 50% 0;\n  bottom: 0;\n  border-bottom-left-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n\n.flip-clock-wrapper ul li a div div.inn {\n  position: absolute;\n  left: 0;\n  z-index: 1;\n  width: 100%;\n  height: 200%;\n  color: #ccc;\n  text-shadow: 0 1px 2px #000;\n  text-align: center;\n  background-color: #333;\n  border-radius: 6px;\n  font-size: 70px; }\n\n.flip-clock-wrapper ul li a div.up div.inn {\n  top: 0; }\n\n.flip-clock-wrapper ul li a div.down div.inn {\n  bottom: 0; }\n\n/* PLAY */\n.flip-clock-wrapper ul.play li.flip-clock-before {\n  z-index: 3; }\n\n.flip-clock-wrapper .flip {   box-shadow: 0 2px 5px rgba(0, 0, 0, 0.7); }\n\n.flip-clock-wrapper ul.play li.flip-clock-active {\n  -webkit-animation: asd 0.5s 0.5s linear both;\n  -moz-animation: asd 0.5s 0.5s linear both;\n  animation: asd 0.5s 0.5s linear both;\n  z-index: 5; }\n\n.flip-clock-divider {\n  float: left;\n  display: inline-block;\n  position: relative;\n  width: 20px;\n  height: 100px; }\n\n.flip-clock-divider:first-child {\n  width: 0; }\n\n.flip-clock-dot {\n  display: block;\n  background: #323434;\n  width: 10px;\n  height: 10px;\n  position: absolute;\n  border-radius: 50%;\n  box-shadow: 0 0 5px rgba(0, 0, 0, 0.5);\n  left: 5px; }\n\n.flip-clock-divider .flip-clock-label {\n  position: absolute;\n  top: -1.5em;\n  right: -86px;\n  color: black;\n  text-shadow: none; }\n\n.flip-clock-divider.minutes .flip-clock-label {\n  right: -88px; }\n\n.flip-clock-divider.seconds .flip-clock-label {\n  right: -91px; }\n\n.flip-clock-dot.top {\n  top: 30px; }\n\n.flip-clock-dot.bottom {\n  bottom: 30px; }\n\n@-webkit-keyframes asd {\n  0% {\n    z-index: 2; }\n\n  20% {\n    z-index: 4; }\n\n  100% {\n    z-index: 4; } }\n\n@-moz-keyframes asd {\n  0% {\n    z-index: 2; }\n\n  20% {\n    z-index: 4; }\n\n  100% {\n    z-index: 4; } }\n\n@-o-keyframes asd {\n  0% {\n    z-index: 2; }\n\n  20% {\n    z-index: 4; }\n\n  100% {\n    z-index: 4; } }\n\n@keyframes asd {\n  0% {\n    z-index: 2; }\n\n  20% {\n    z-index: 4; }\n\n  100% {\n    z-index: 4; } }\n\n.flip-clock-wrapper ul.play li.flip-clock-active .down {\n  z-index: 2;\n  -webkit-animation: turn 0.5s 0.5s linear both;\n  -moz-animation: turn 0.5s 0.5s linear both;\n  animation: turn 0.5s 0.5s linear both; }\n\n@-webkit-keyframes turn {\n  0% {\n    -webkit-transform: rotateX(90deg); }\n\n  100% {\n    -webkit-transform: rotateX(0deg); } }\n\n@-moz-keyframes turn {\n  0% {\n    -moz-transform: rotateX(90deg); }\n\n  100% {\n    -moz-transform: rotateX(0deg); } }\n\n@-o-keyframes turn {\n  0% {\n    -o-transform: rotateX(90deg); }\n\n  100% {\n    -o-transform: rotateX(0deg); } }\n\n@keyframes turn {\n  0% {\n    transform: rotateX(90deg); }\n\n  100% {\n    transform: rotateX(0deg); } }\n\n.flip-clock-wrapper ul.play li.flip-clock-before .up {\n  z-index: 2;\n  -webkit-animation: turn2 0.5s linear both;\n  -moz-animation: turn2 0.5s linear both;\n  animation: turn2 0.5s linear both; }\n\n@-webkit-keyframes turn2 {\n  0% {\n    -webkit-transform: rotateX(0deg); }\n\n  100% {\n    -webkit-transform: rotateX(-90deg); } }\n\n@-moz-keyframes turn2 {\n  0% {\n    -moz-transform: rotateX(0deg); }\n\n  100% {\n    -moz-transform: rotateX(-90deg); } }\n\n@-o-keyframes turn2 {\n  0% {\n    -o-transform: rotateX(0deg); }\n\n  100% {\n    -o-transform: rotateX(-90deg); } }\n\n@keyframes turn2 {\n  0% {\n    transform: rotateX(0deg); }\n\n  100% {\n    transform: rotateX(-90deg); } }\n\n.flip-clock-wrapper ul li.flip-clock-active {\n  z-index: 3; }\n\n/* SHADOW */\n.flip-clock-wrapper ul.play li.flip-clock-before .up .shadow {\n  background: -moz-linear-gradient(top, rgba(0, 0, 0, 0.1) 0%, black 100%);\n  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(0, 0, 0, 0.1)), color-stop(100%, black));\n  background: linear, top, rgba(0, 0, 0, 0.1) 0%, black 100%;\n  background: -o-linear-gradient(top, rgba(0, 0, 0, 0.1) 0%, black 100%);\n  background: -ms-linear-gradient(top, rgba(0, 0, 0, 0.1) 0%, black 100%);\n  background: linear, to bottom, rgba(0, 0, 0, 0.1) 0%, black 100%;\n  -webkit-animation: show 0.5s linear both;\n  -moz-animation: show 0.5s linear both;\n  animation: show 0.5s linear both; }\n\n.flip-clock-wrapper ul.play li.flip-clock-active .up .shadow {\n  background: -moz-linear-gradient(top, rgba(0, 0, 0, 0.1) 0%, black 100%);\n  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(0, 0, 0, 0.1)), color-stop(100%, black));\n  background: linear, top, rgba(0, 0, 0, 0.1) 0%, black 100%;\n  background: -o-linear-gradient(top, rgba(0, 0, 0, 0.1) 0%, black 100%);\n  background: -ms-linear-gradient(top, rgba(0, 0, 0, 0.1) 0%, black 100%);\n  background: linear, to bottom, rgba(0, 0, 0, 0.1) 0%, black 100%;\n  -webkit-animation: hide 0.5s 0.3s linear both;\n  -moz-animation: hide 0.5s 0.3s linear both;\n  animation: hide 0.5s 0.3s linear both; }\n\n/*DOWN*/\n.flip-clock-wrapper ul.play li.flip-clock-before .down .shadow {\n  background: -moz-linear-gradient(top, black 0%, rgba(0, 0, 0, 0.1) 100%);\n  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, black), color-stop(100%, rgba(0, 0, 0, 0.1)));\n  background: linear, top, black 0%, rgba(0, 0, 0, 0.1) 100%;\n  background: -o-linear-gradient(top, black 0%, rgba(0, 0, 0, 0.1) 100%);\n  background: -ms-linear-gradient(top, black 0%, rgba(0, 0, 0, 0.1) 100%);\n  background: linear, to bottom, black 0%, rgba(0, 0, 0, 0.1) 100%;\n  -webkit-animation: show 0.5s linear both;\n  -moz-animation: show 0.5s linear both;\n  animation: show 0.5s linear both; }\n\n.flip-clock-wrapper ul.play li.flip-clock-active .down .shadow {\n  background: -moz-linear-gradient(top, black 0%, rgba(0, 0, 0, 0.1) 100%);\n  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, black), color-stop(100%, rgba(0, 0, 0, 0.1)));\n  background: linear, top, black 0%, rgba(0, 0, 0, 0.1) 100%;\n  background: -o-linear-gradient(top, black 0%, rgba(0, 0, 0, 0.1) 100%);\n  background: -ms-linear-gradient(top, black 0%, rgba(0, 0, 0, 0.1) 100%);\n  background: linear, to bottom, black 0%, rgba(0, 0, 0, 0.1) 100%;\n  -webkit-animation: hide 0.5s 0.3s linear both;\n  -moz-animation: hide 0.5s 0.3s linear both;\n  animation: hide 0.5s 0.2s linear both; }\n\n@-webkit-keyframes show {\n  0% {\n    opacity: 0; }\n\n  100% {\n    opacity: 1; } }\n\n@-moz-keyframes show {\n  0% {\n    opacity: 0; }\n\n  100% {\n    opacity: 1; } }\n\n@-o-keyframes show {\n  0% {\n    opacity: 0; }\n\n  100% {\n    opacity: 1; } }\n\n@keyframes show {\n  0% {\n    opacity: 0; }\n\n  100% {\n    opacity: 1; } }\n\n@-webkit-keyframes hide {\n  0% {\n    opacity: 1; }\n\n  100% {\n    opacity: 0; } }\n\n@-moz-keyframes hide {\n  0% {\n    opacity: 1; }\n\n  100% {\n    opacity: 0; } }\n\n@-o-keyframes hide {\n  0% {\n    opacity: 1; }\n\n  100% {\n    opacity: 0; } }\n\n@keyframes hide {\n  0% {\n    opacity: 1; }\n\n  100% {\n    opacity: 0; } }\n"
  },
  {
    "path": "src/main/resources/static/assets/css/fullcalendar.print.css",
    "content": "/*!\n * FullCalendar v0.0.0 Print Stylesheet\n * Docs & License: http://fullcalendar.io/\n * (c) 2016 Adam Shaw\n */\n\n/*\n * Include this stylesheet on your page to get a more printer-friendly calendar.\n * When including this stylesheet, use the media='print' attribute of the <link> tag.\n * Make sure to include this stylesheet IN ADDITION to the regular fullcalendar.css.\n */\n\n.fc {\n\tmax-width: 100% !important;\n}\n\n\n/* Global Event Restyling\n--------------------------------------------------------------------------------------------------*/\n\n.fc-event {\n\tbackground: #fff !important;\n\tcolor: #000 !important;\n\tpage-break-inside: avoid;\n}\n\n.fc-event .fc-resizer {\n\tdisplay: none;\n}\n\n\n/* Table & Day-Row Restyling\n--------------------------------------------------------------------------------------------------*/\n\n.fc th,\n.fc td,\n.fc hr,\n.fc thead,\n.fc tbody,\n.fc-row {\n\tborder-color: #ccc !important;\n\tbackground: #fff !important;\n}\n\n/* kill the overlaid, absolutely-positioned components */\n/* common... */\n.fc-bg,\n.fc-bgevent-skeleton,\n.fc-highlight-skeleton,\n.fc-helper-skeleton,\n/* for timegrid. within cells within table skeletons... */\n.fc-bgevent-container,\n.fc-business-container,\n.fc-highlight-container,\n.fc-helper-container {\n\tdisplay: none;\n}\n\n/* don't force a min-height on rows (for DayGrid) */\n.fc tbody .fc-row {\n\theight: auto !important; /* undo height that JS set in distributeHeight */\n\tmin-height: 0 !important; /* undo the min-height from each view's specific stylesheet */\n}\n\n.fc tbody .fc-row .fc-content-skeleton {\n\tposition: static; /* undo .fc-rigid */\n\tpadding-bottom: 0 !important; /* use a more border-friendly method for this... */\n}\n\n.fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td { /* only works in newer browsers */\n\tpadding-bottom: 1em; /* ...gives space within the skeleton. also ensures min height in a way */\n}\n\n.fc tbody .fc-row .fc-content-skeleton table {\n\t/* provides a min-height for the row, but only effective for IE, which exaggerates this value,\n\t   making it look more like 3em. for other browers, it will already be this tall */\n\theight: 1em;\n}\n\n\n/* Undo month-view event limiting. Display all events and hide the \"more\" links\n--------------------------------------------------------------------------------------------------*/\n\n.fc-more-cell,\n.fc-more {\n\tdisplay: none !important;\n}\n\n.fc tr.fc-limited {\n\tdisplay: table-row !important;\n}\n\n.fc td.fc-limited {\n\tdisplay: table-cell !important;\n}\n\n.fc-popover {\n\tdisplay: none; /* never display the \"more..\" popover in print mode */\n}\n\n\n/* TimeGrid Restyling\n--------------------------------------------------------------------------------------------------*/\n\n/* undo the min-height 100% trick used to fill the container's height */\n.fc-time-grid {\n\tmin-height: 0 !important;\n}\n\n/* don't display the side axis at all (\"all-day\" and time cells) */\n.fc-agenda-view .fc-axis {\n\tdisplay: none;\n}\n\n/* don't display the horizontal lines */\n.fc-slats,\n.fc-time-grid hr { /* this hr is used when height is underused and needs to be filled */\n\tdisplay: none !important; /* important overrides inline declaration */\n}\n\n/* let the container that holds the events be naturally positioned and create real height */\n.fc-time-grid .fc-content-skeleton {\n\tposition: static;\n}\n\n/* in case there are no events, we still want some height */\n.fc-time-grid .fc-content-skeleton table {\n\theight: 4em;\n}\n\n/* kill the horizontal spacing made by the event container. event margins will be done below */\n.fc-time-grid .fc-event-container {\n\tmargin: 0 !important;\n}\n\n\n/* TimeGrid *Event* Restyling\n--------------------------------------------------------------------------------------------------*/\n\n/* naturally position events, vertically stacking them */\n.fc-time-grid .fc-event {\n\tposition: static !important;\n\tmargin: 3px 2px !important;\n}\n\n/* for events that continue to a future day, give the bottom border back */\n.fc-time-grid .fc-event.fc-not-end {\n\tborder-bottom-width: 1px !important;\n}\n\n/* indicate the event continues via \"...\" text */\n.fc-time-grid .fc-event.fc-not-end:after {\n\tcontent: \"...\";\n}\n\n/* for events that are continuations from previous days, give the top border back */\n.fc-time-grid .fc-event.fc-not-start {\n\tborder-top-width: 1px !important;\n}\n\n/* indicate the event is a continuation via \"...\" text */\n.fc-time-grid .fc-event.fc-not-start:before {\n\tcontent: \"...\";\n}\n\n/* time */\n\n/* undo a previous declaration and let the time text span to a second line */\n.fc-time-grid .fc-event .fc-time {\n\twhite-space: normal !important;\n}\n\n/* hide the the time that is normally displayed... */\n.fc-time-grid .fc-event .fc-time span {\n\tdisplay: none;\n}\n\n/* ...replace it with a more verbose version (includes AM/PM) stored in an html attribute */\n.fc-time-grid .fc-event .fc-time:after {\n\tcontent: attr(data-full);\n}\n\n\n/* Vertical Scroller & Containers\n--------------------------------------------------------------------------------------------------*/\n\n/* kill the scrollbars and allow natural height */\n.fc-scroller,\n.fc-day-grid-container,    /* these divs might be assigned height, which we need to cleared */\n.fc-time-grid-container {  /* */\n\toverflow: visible !important;\n\theight: auto !important;\n}\n\n/* kill the horizontal border/padding used to compensate for scrollbars */\n.fc-row {\n\tborder: 0 !important;\n\tmargin: 0 !important;\n}\n\n\n/* Button Controls\n--------------------------------------------------------------------------------------------------*/\n\n.fc-button-group,\n.fc button {\n\tdisplay: none; /* don't display any button-related controls */\n}\n"
  },
  {
    "path": "src/main/resources/static/assets/css/todomvc.css",
    "content": "[v-cloak] { display: none; }\n\n#todomvc button {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: none;\n\tfont-size: 100%;\n\tvertical-align: baseline;\n\tfont-family: inherit;\n\tfont-weight: inherit;\n\tcolor: inherit;\n\t-webkit-appearance: none;\n\tappearance: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n#todomvc{\n\tfont: 14px 'Helvetica Neue', Helvetica, Arial, sans-serif;\n\tline-height: 1.4em;\n\tbackground: #f5f5f5;\n\tcolor: #4d4d4d;\n\tmin-width: 230px;\n\tmax-width: 550px;\n\tmargin: 0 auto;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tfont-weight: 300;\n}\n\n#todomvc button,\n#todomvc input[type=\"checkbox\"] {\n\toutline: none;\n}\n\n.hidden {\n\tdisplay: none;\n}\n\n.todoapp {\n\tbackground: #fff;\n\tmargin: 130px 0 40px 0;\n\tposition: relative;\n\tbox-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2),\n\t0 25px 50px 0 rgba(0, 0, 0, 0.1);\n}\n\n.todoapp input::-webkit-input-placeholder {\n\tfont-style: italic;\n\tfont-weight: 300;\n\tcolor: #e6e6e6;\n}\n\n.todoapp input::-moz-placeholder {\n\tfont-style: italic;\n\tfont-weight: 300;\n\tcolor: #e6e6e6;\n}\n\n.todoapp input::input-placeholder {\n\tfont-style: italic;\n\tfont-weight: 300;\n\tcolor: #e6e6e6;\n}\n\n.todoapp h1 {\n\tposition: absolute;\n\ttop: -155px;\n\twidth: 100%;\n\tfont-size: 100px;\n\tfont-weight: 100;\n\ttext-align: center;\n\tcolor: rgba(175, 47, 47, 0.15);\n\t-webkit-text-rendering: optimizeLegibility;\n\t-moz-text-rendering: optimizeLegibility;\n\ttext-rendering: optimizeLegibility;\n}\n\n.new-todo,\n.edit {\n\tposition: relative;\n\tmargin: 0;\n\twidth: 100%;\n\tfont-size: 24px;\n\tfont-family: inherit;\n\tfont-weight: inherit;\n\tline-height: 1.4em;\n\tborder: 0;\n\toutline: none;\n\tcolor: inherit;\n\tpadding: 6px;\n\tborder: 1px solid #999;\n\tbox-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);\n\tbox-sizing: border-box;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.new-todo {\n\tpadding: 16px 16px 16px 60px;\n\tborder: none;\n\tbackground: rgba(0, 0, 0, 0.003);\n\tbox-shadow: inset 0 -2px 1px rgba(0,0,0,0.03);\n}\n\n.main {\n\tposition: relative;\n\tz-index: 2;\n\tborder-top: 1px solid #e6e6e6;\n}\n\n#todomvc label[for='toggle-all'] {\n\tdisplay: none;\n}\n\n.toggle-all {\n\tposition: absolute;\n\ttop: -55px;\n\tleft: -12px;\n\twidth: 60px;\n\theight: 34px;\n\ttext-align: center;\n\tborder: none; /* Mobile Safari */\n}\n\n.toggle-all:before {\n\tcontent: '❯';\n\tfont-size: 22px;\n\tcolor: #e6e6e6;\n\tpadding: 10px 27px 10px 27px;\n}\n\n.toggle-all:checked:before {\n\tcolor: #737373;\n}\n\n.todo-list {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.todo-list li {\n\tposition: relative;\n\tfont-size: 24px;\n\tborder-bottom: 1px solid #ededed;\n}\n\n.todo-list li:last-child {\n\tborder-bottom: none;\n}\n\n.todo-list li.editing {\n\tborder-bottom: none;\n\tpadding: 0;\n}\n\n.todo-list li.editing .edit {\n\tdisplay: block;\n\twidth: 506px;\n\tpadding: 13px 17px 12px 17px;\n\tmargin: 0 0 0 43px;\n}\n\n.todo-list li.editing .view {\n\tdisplay: none;\n}\n\n.todo-list li .toggle {\n\ttext-align: center;\n\twidth: 40px;\n\t/* auto, since non-WebKit browsers doesn't support input styling */\n\theight: auto;\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tmargin: auto 0;\n\tborder: none; /* Mobile Safari */\n\t-webkit-appearance: none;\n\tappearance: none;\n}\n\n.todo-list li .toggle:after {\n\tcontent: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"-10 -18 100 135\"><circle cx=\"50\" cy=\"50\" r=\"50\" fill=\"none\" stroke=\"#ededed\" stroke-width=\"3\"/></svg>');\n}\n\n.todo-list li .toggle:checked:after {\n\tcontent: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"-10 -18 100 135\"><circle cx=\"50\" cy=\"50\" r=\"50\" fill=\"none\" stroke=\"#bddad5\" stroke-width=\"3\"/><path fill=\"#5dc2af\" d=\"M72 25L42 71 27 56l-4 4 20 20 34-52z\"/></svg>');\n}\n\n.todo-list li label {\n\twhite-space: pre-line;\n\tword-break: break-all;\n\tpadding: 15px 60px 15px 15px;\n\tmargin-left: 45px;\n\tdisplay: block;\n\tline-height: 1.2;\n\ttransition: color 0.4s;\n}\n\n.todo-list li.completed label {\n\tcolor: #d9d9d9;\n\ttext-decoration: line-through;\n}\n\n.todo-list li .destroy {\n\tdisplay: none;\n\tposition: absolute;\n\ttop: 0;\n\tright: 10px;\n\tbottom: 0;\n\twidth: 40px;\n\theight: 40px;\n\tmargin: auto 0;\n\tfont-size: 30px;\n\tcolor: #cc9a9a;\n\tmargin-bottom: 11px;\n\ttransition: color 0.2s ease-out;\n}\n\n.todo-list li .destroy:hover {\n\tcolor: #af5b5e;\n}\n\n.todo-list li .destroy:after {\n\tcontent: '×';\n}\n\n.todo-list li:hover .destroy {\n\tdisplay: block;\n}\n\n.todo-list li .edit {\n\tdisplay: none;\n}\n\n.todo-list li.editing:last-child {\n\tmargin-bottom: -1px;\n}\n\n.footer {\n\tcolor: #777;\n\tpadding: 10px 15px;\n\theight: 20px;\n\ttext-align: center;\n\tborder-top: 1px solid #e6e6e6;\n}\n\n.footer:before {\n\tcontent: '';\n\tposition: absolute;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\theight: 50px;\n\toverflow: hidden;\n\tbox-shadow: 0 1px 1px rgba(0, 0, 0, 0.2),\n\t0 8px 0 -3px #f6f6f6,\n\t0 9px 1px -3px rgba(0, 0, 0, 0.2),\n\t0 16px 0 -6px #f6f6f6,\n\t0 17px 2px -6px rgba(0, 0, 0, 0.2);\n}\n\n.todo-count {\n\tfloat: left;\n\ttext-align: left;\n}\n\n.todo-count strong {\n\tfont-weight: 300;\n}\n\n.filters {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n\tposition: absolute;\n\tright: 0;\n\tleft: 0;\n}\n\n.filters li {\n\tdisplay: inline;\n}\n\n.filters li a {\n\tcolor: inherit;\n\tmargin: 3px;\n\tpadding: 3px 7px;\n\ttext-decoration: none;\n\tborder: 1px solid transparent;\n\tborder-radius: 3px;\n}\n\n.filters li a.selected,\n.filters li a:hover {\n\tborder-color: rgba(175, 47, 47, 0.1);\n}\n\n.filters li a.selected {\n\tborder-color: rgba(175, 47, 47, 0.2);\n}\n\n.clear-completed,\nhtml .clear-completed:active {\n\tfloat: right;\n\tposition: relative;\n\tline-height: 20px;\n\ttext-decoration: none;\n\tcursor: pointer;\n}\n\n.clear-completed:hover {\n\ttext-decoration: underline;\n}\n\n.info {\n\tmargin: 65px auto 0;\n\tcolor: #bfbfbf;\n\tfont-size: 10px;\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n\ttext-align: center;\n}\n\n.info p {\n\tline-height: 1;\n}\n\n.info a {\n\tcolor: inherit;\n\ttext-decoration: none;\n\tfont-weight: 400;\n}\n\n.info a:hover {\n\ttext-decoration: underline;\n}\n\n/*\n\tHack to remove background from Mobile Safari.\n\tCan't use it globally since it destroys checkboxes in Firefox\n*/\n@media screen and (-webkit-min-device-pixel-ratio:0) {\n\t.toggle-all,\n\t.todo-list li .toggle {\n\t\tbackground: none;\n\t}\n\n\t.todo-list li .toggle {\n\t\theight: 40px;\n\t}\n\n\t.toggle-all {\n\t\t-webkit-transform: rotate(90deg);\n\t\ttransform: rotate(90deg);\n\t\t-webkit-appearance: none;\n\t\tappearance: none;\n\t}\n}\n\n@media (max-width: 430px) {\n\t.footer {\n\t\theight: 50px;\n\t}\n\n\t.filters {\n\t\tbottom: 10px;\n\t}\n}\n"
  },
  {
    "path": "src/main/resources/static/assets/js/app.js",
    "content": "$(function() {\n    // 读取body data-type 判断是哪个页面然后执行相应页面方法，方法在下面。\n    var dataType = $('.centerView').attr('data-type');\n    console.log(dataType);\n    for (key in pageData) {\n        if (key == dataType) {\n            pageData[key]();\n        }\n    }\n    //     // 判断用户是否已有自己选择的模板风格\n    //    if(storageLoad('SelcetColor')){\n    //      $('body').attr('class',storageLoad('SelcetColor').Color)\n    //    }else{\n    //        storageSave(saveSelectColor);\n    //        $('body').attr('class','theme-black')\n    //    }\n\n    autoLeftNav();\n    $(window).resize(function() {\n        autoLeftNav();\n        console.log($(window).width())\n    });\n\n    \n})\n\n\n// 页面数据\nvar pageData = {\n    // ===============================================\n    // 首页\n    // ===============================================\n    'index': function indexData() {\n        $('#example-r').DataTable({\n\n            bInfo: false, //页脚信息\n            dom: 'ti'\n        });\n\n\n        // ==========================\n        // 百度图表A http://echarts.baidu.com/\n        // ==========================\n\n        var echartsA = echarts.init(document.getElementById('tpl-echarts'));\n        option = {\n            tooltip: {\n                trigger: 'axis'\n            },\n            grid: {\n                top: '3%',\n                left: '3%',\n                right: '4%',\n                bottom: '3%',\n                containLabel: true\n            },\n            xAxis: [{\n                type: 'category',\n                boundaryGap: false,\n                data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']\n            }],\n            yAxis: [{\n                type: 'value'\n            }],\n            textStyle: {\n                color: '#838FA1'\n            },\n            series: [{\n                name: '邮件营销',\n                type: 'line',\n                stack: '总量',\n                areaStyle: { normal: {} },\n                data: [120, 132, 101, 134, 90],\n                itemStyle: {\n                    normal: {\n                        color: '#1cabdb',\n                        borderColor: '#1cabdb',\n                        borderWidth: '2',\n                        borderType: 'solid',\n                        opacity: '1'\n                    },\n                    emphasis: {\n\n                    }\n                }\n            }]\n        };\n\n        echartsA.setOption(option);\n    },\n    // ===============================================\n    // 图表页\n    // ===============================================\n    'chart': function chartData() {\n        // ==========================\n        // 百度图表A http://echarts.baidu.com/\n        // ==========================\n\n        var echartsC = echarts.init(document.getElementById('tpl-echarts-C'));\n\n\n        optionC = {\n            tooltip: {\n                trigger: 'axis'\n            },\n\n            legend: {\n                data: ['蒸发量', '降水量', '平均温度']\n            },\n            xAxis: [{\n                type: 'category',\n                data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']\n            }],\n            yAxis: [{\n                    type: 'value',\n                    name: '水量',\n                    min: 0,\n                    max: 250,\n                    interval: 50,\n                    axisLabel: {\n                        formatter: '{value} ml'\n                    }\n                },\n                {\n                    type: 'value',\n                    name: '温度',\n                    min: 0,\n                    max: 25,\n                    interval: 5,\n                    axisLabel: {\n                        formatter: '{value} °C'\n                    }\n                }\n            ],\n            series: [{\n                    name: '蒸发量',\n                    type: 'bar',\n                    data: [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3]\n                },\n                {\n                    name: '降水量',\n                    type: 'bar',\n                    data: [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3]\n                },\n                {\n                    name: '平均温度',\n                    type: 'line',\n                    yAxisIndex: 1,\n                    data: [2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2]\n                }\n            ]\n        };\n\n        echartsC.setOption(optionC);\n\n        var echartsB = echarts.init(document.getElementById('tpl-echarts-B'));\n        optionB = {\n            tooltip: {\n                trigger: 'axis'\n            },\n            legend: {\n                x: 'center',\n                data: ['某软件', '某主食手机', '某水果手机', '降水量', '蒸发量']\n            },\n            radar: [{\n                    indicator: [\n                        { text: '品牌', max: 100 },\n                        { text: '内容', max: 100 },\n                        { text: '可用性', max: 100 },\n                        { text: '功能', max: 100 }\n                    ],\n                    center: ['25%', '40%'],\n                    radius: 80\n                },\n                {\n                    indicator: [\n                        { text: '外观', max: 100 },\n                        { text: '拍照', max: 100 },\n                        { text: '系统', max: 100 },\n                        { text: '性能', max: 100 },\n                        { text: '屏幕', max: 100 }\n                    ],\n                    radius: 80,\n                    center: ['50%', '60%'],\n                },\n                {\n                    indicator: (function() {\n                        var res = [];\n                        for (var i = 1; i <= 12; i++) {\n                            res.push({ text: i + '月', max: 100 });\n                        }\n                        return res;\n                    })(),\n                    center: ['75%', '40%'],\n                    radius: 80\n                }\n            ],\n            series: [{\n                    type: 'radar',\n                    tooltip: {\n                        trigger: 'item'\n                    },\n                    itemStyle: { normal: { areaStyle: { type: 'default' } } },\n                    data: [{\n                        value: [60, 73, 85, 40],\n                        name: '某软件'\n                    }]\n                },\n                {\n                    type: 'radar',\n                    radarIndex: 1,\n                    data: [{\n                            value: [85, 90, 90, 95, 95],\n                            name: '某主食手机'\n                        },\n                        {\n                            value: [95, 80, 95, 90, 93],\n                            name: '某水果手机'\n                        }\n                    ]\n                },\n                {\n                    type: 'radar',\n                    radarIndex: 2,\n                    itemStyle: { normal: { areaStyle: { type: 'default' } } },\n                    data: [{\n                            name: '降水量',\n                            value: [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 75.6, 82.2, 48.7, 18.8, 6.0, 2.3],\n                        },\n                        {\n                            name: '蒸发量',\n                            value: [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 35.6, 62.2, 32.6, 20.0, 6.4, 3.3]\n                        }\n                    ]\n                }\n            ]\n        };\n        echartsB.setOption(optionB);\n        var echartsA = echarts.init(document.getElementById('tpl-echarts-A'));\n        option = {\n\n            tooltip: {\n                trigger: 'axis',\n            },\n            legend: {\n                data: ['邮件', '媒体', '资源']\n            },\n            grid: {\n                left: '3%',\n                right: '4%',\n                bottom: '3%',\n                containLabel: true\n            },\n            xAxis: [{\n                type: 'category',\n                boundaryGap: true,\n                data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']\n            }],\n\n            yAxis: [{\n                type: 'value'\n            }],\n            series: [{\n                    name: '邮件',\n                    type: 'line',\n                    stack: '总量',\n                    areaStyle: { normal: {} },\n                    data: [120, 132, 101, 134, 90, 230, 210],\n                    itemStyle: {\n                        normal: {\n                            color: '#59aea2'\n                        },\n                        emphasis: {\n\n                        }\n                    }\n                },\n                {\n                    name: '媒体',\n                    type: 'line',\n                    stack: '总量',\n                    areaStyle: { normal: {} },\n                    data: [220, 182, 191, 234, 290, 330, 310],\n                    itemStyle: {\n                        normal: {\n                            color: '#e7505a'\n                        }\n                    }\n                },\n                {\n                    name: '资源',\n                    type: 'line',\n                    stack: '总量',\n                    areaStyle: { normal: {} },\n                    data: [150, 232, 201, 154, 190, 330, 410],\n                    itemStyle: {\n                        normal: {\n                            color: '#32c5d2'\n                        }\n                    }\n                }\n            ]\n        };\n        echartsA.setOption(option);\n    }\n}\n\n\n// 风格切换\n\n$('.tpl-skiner-toggle').on('click', function() {\n    $('.tpl-skiner').toggleClass('active');\n})\n\n$('.tpl-skiner-content-bar').find('span').on('click', function() {\n    $('body').attr('class', $(this).attr('data-color'))\n    saveSelectColor.Color = $(this).attr('data-color');\n    // 保存选择项\n    storageSave(saveSelectColor);\n\n})\n\n\n\n\n// 侧边菜单开关\n\n\nfunction autoLeftNav() {\n\n\n\n    $('.tpl-header-switch-button').on('click', function() {\n        if ($('.left-sidebar').is('.active')) {\n            if ($(window).width() > 1024) {\n                $('.tpl-content-wrapper').removeClass('active');\n            }\n            $('.left-sidebar').removeClass('active');\n        } else {\n\n            $('.left-sidebar').addClass('active');\n            if ($(window).width() > 1024) {\n                $('.tpl-content-wrapper').addClass('active');\n            }\n        }\n    })\n\n    if ($(window).width() < 1024) {\n        $('.left-sidebar').addClass('active');\n    } else {\n        $('.left-sidebar').removeClass('active');\n    }\n}\n\n\n// 侧边菜单\n$('.sidebar-nav-sub-title').on('click', function() {\n    $(this).siblings('.sidebar-nav-sub').slideToggle(80)\n        .end()\n        .find('.sidebar-nav-sub-ico').toggleClass('sidebar-nav-sub-ico-rotate');\n})"
  },
  {
    "path": "src/main/resources/static/assets/js/calculator.js",
    "content": "// JavaScript Document\ndocument.oncontextmenu=new Function(\"event.returnValue=false;\");\ndocument.onselectstart=new Function(\"event.returnValue=false;\");\nvar _string=new Array();\nvar _type;\nfunction typetoinput(num)\n{\n\tinput=document.getElementById(\"input-box\");\n\tif(input.name==\"type\")\n\t{\n\t\tinput.value=\" \";\n\t\tinput.name=\" \";\n\t}\n\tif(num!=\".\"&&input.value[0]==0&&input.value[1]!=\".\") \n\t{\n\t\tinput.value=num; //Reset input num\n\t}\n\telse if(num==\".\"&&input.value.indexOf(\".\")>-1)\n\t{\n\t\tinput.value=input.value; //Only one point allow input\n\t}\n\telse if(input.value==\"Infinity\"||input.value==\"NaN\")\n\t{\n\t\tinput.value=\"\";\n\t\tinput.value+=num; //Splicing string\n\t}\n\telse\n\t{\n\t\tinput.value+=num;\n\t}\n}\n\nfunction operator(type)\n{\n\tswitch (type)\n\t{\n\t\tcase \"clear\":\n\t\t\t\tinput.value=\"0\";\n\t\t\t\t_string.length=0;\n\t\t\t\t/*document.getElementById(\"ccc\").innerHTML=\"\";\n\t\t\t\tfor(i=0;i<_string.length;i++)\n\t\t\t\t{\n\t\t\t\t\tdocument.getElementById(\"ccc\").innerHTML+=_string[i]+\" \"\t\t\n\t\t\t\t}*/\n\t\t\t\tbreak;\n\t\tcase \"backspace\":\n\t\t\t\tif(checknum(input.value)!=0)\n\t\t\t\t{\n\t\t\t\t\tinput.value=input.value.replace(/.$/,'');\n\t\t\t\t\tif(input.value==\"\")\n\t\t\t\t\t{\n\t\t\t\t\t\tinput.value=\"0\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\tcase \"opposite\":\n\t\t\t\tif(checknum(input.value)!=0)\n\t\t\t\t{\n\t\t\t\t\tinput.value=-input.value;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\tcase \"percent\":\n\t\t\t\tif(checknum(input.value)!=0)\n\t\t\t\t{\n\t\t\t\t\tinput.value=input.value/100;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\tcase \"pow\":\n\t\t\t\tif(checknum(input.value)!=0)\n\t\t\t\t{\n\t\t\t\t\tinput.value=Math.pow(input.value,2);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\tcase \"sqrt\":\n\t\t\t\tif(checknum(input.value)!=0)\n\t\t\t\t{\n\t\t\t\t\tinput.value=Math.sqrt(input.value);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\tcase \"plus\":\n\t\t\t\tif(checknum(input.value)!=0)\n\t\t\t\t{\n\t\t\t\t\t_string.push(input.value);\n\t\t\t\t\t_type=\"plus\"\n\t\t\t\t\tinput.value=\"+\";\n\t\t\t\t\tinput.name=\"type\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\tcase \"minus\":\n\t\t\t\tif(checknum(input.value)!=0)\n\t\t\t\t{\n\t\t\t\t\t_string.push(input.value);\n\t\t\t\t\t_type=\"minus\"\n\t\t\t\t\tinput.value=\"-\";\n\t\t\t\t\tinput.name=\"type\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\tcase \"multiply\":\n\t\t\t\tif(checknum(input.value)!=0)\n\t\t\t\t{\n\t\t\t\t\t_string.push(input.value);\n\t\t\t\t\t_type=\"multiply\"\n\t\t\t\t\tinput.value=\"×\";\n\t\t\t\t\tinput.name=\"type\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\tcase \"divide\":\n\t\t\t\tif(checknum(input.value)!=0)\n\t\t\t\t{\n\t\t\t\t\t_string.push(input.value);\n\t\t\t\t\t_type=\"divide\"\n\t\t\t\t\tinput.value=\"÷\";\n\t\t\t\t\tinput.name=\"type\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\tcase \"result\":\n\t\t\t\tif(checknum(input.value)!=0)\n\t\t\t\t{\n\t\t\t\t\t_string.push(input.value);\n\t\t\t\t\tif(parseInt(_string.length)%2!=0)\n\t\t\t\t\t{\n\t\t\t\t\t\t_string.push(_string[_string.length-2])\n\t\t\t\t\t}\n\t\t\t\t\tif(_type==\"plus\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinput.value=parseFloat(result(_string)[0])+parseFloat(result(_string)[1]);\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tinput.name=\"type\"\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(_type==\"minus\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinput.value=parseFloat(result(_string)[0])-parseFloat(result(_string)[1]);\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tinput.name=\"type\"\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(_type==\"multiply\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinput.value=parseFloat(result(_string)[0])*parseFloat(result(_string)[1]);\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tinput.name=\"type\"\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(_type==\"divide\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tinput.value=parseFloat(result(_string)[0])/parseFloat(result(_string)[1]);\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tinput.name=\"type\"\n\t\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\n\t}\n}\n\nfunction result(value)\n{\n\tvar result=new Array;\n\tif(value.length%2==0)\n\t{\n\t\tresult.push((value[value.length-2]));\n\t\tresult.push((value[value.length-1]));\n\t\treturn (result);\n\t}\n\telse\n\t{\n\t\tresult.push((value[value.length-1]))\n\t\tresult.push((value[value.length-2]))\n\t\t\n\t\treturn (result);\n\t}\n}\n\nfunction checknum(inputvalue)\n{\n\tif(inputvalue==\"+\"||inputvalue==\"-\"||inputvalue==\"×\"||inputvalue==\"÷\"||input.value==\"0\")\n\t{\n\t\treturn 0;\n\t}\n}\n\n\nwindow.document.onkeydown = disableRefresh;\nfunction disableRefresh(evt){\nevt = (evt) ? evt : window.event\nif (evt.keyCode && calculatorIsOpen)\n{\n   if(evt.keyCode == 13){operator('result')}\n   else if(evt.keyCode == 8){input.focus();window.event.returnValue = false;operator('backspace')}\n   else if(evt.keyCode == 27){operator('clear')}\n   else if(evt.keyCode == 48){typetoinput('0')}\n   else if(evt.keyCode == 49){typetoinput('1')}\n   else if(evt.keyCode == 50){typetoinput('2')}\n   else if(evt.keyCode == 51){typetoinput('3')}\n   else if(evt.keyCode == 52){typetoinput('4')}\n   else if(evt.keyCode == 53){typetoinput('5')}\n   else if(evt.keyCode == 54){typetoinput('6')}\n   else if(evt.keyCode == 55){typetoinput('7')}\n   else if(evt.keyCode == 56){typetoinput('8')}\n   else if(evt.keyCode == 57){typetoinput('9')}\n   else if(evt.keyCode == 96){typetoinput('0')}\n   else if(evt.keyCode == 97){typetoinput('1')}\n   else if(evt.keyCode == 98){typetoinput('2')}\n   else if(evt.keyCode == 99){typetoinput('3')}\n   else if(evt.keyCode == 100){typetoinput('4')}\n   else if(evt.keyCode == 101){typetoinput('5')}\n   else if(evt.keyCode == 102){typetoinput('6')}\n   else if(evt.keyCode == 103){typetoinput('7')}\n   else if(evt.keyCode == 104){typetoinput('8')}\n   else if(evt.keyCode == 105){typetoinput('9')}\n   else if(evt.keyCode == 110){typetoinput('.')}\n   else if(evt.keyCode == 106){operator('multiply')}\n   else if(evt.keyCode == 107){operator('plus')}\n   else if(evt.keyCode == 111){operator('divide')}\n   else if(evt.keyCode == 109){operator('minus')}\n}\n}"
  },
  {
    "path": "src/main/resources/static/assets/js/moment.js",
    "content": "//! moment.js\n//! version : 2.15.1\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n\n;(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    global.moment = factory()\n}(this, function () { 'use strict';\n\n    var hookCallback;\n\n    function utils_hooks__hooks () {\n        return hookCallback.apply(null, arguments);\n    }\n\n    // This is done to register the method called with moment()\n    // without creating circular dependencies.\n    function setHookCallback (callback) {\n        hookCallback = callback;\n    }\n\n    function isArray(input) {\n        return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n    }\n\n    function isObject(input) {\n        // IE8 will treat undefined and null as object if it wasn't for\n        // input != null\n        return input != null && Object.prototype.toString.call(input) === '[object Object]';\n    }\n\n    function isObjectEmpty(obj) {\n        var k;\n        for (k in obj) {\n            // even if its not own property I'd still call it non-empty\n            return false;\n        }\n        return true;\n    }\n\n    function isDate(input) {\n        return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n    }\n\n    function map(arr, fn) {\n        var res = [], i;\n        for (i = 0; i < arr.length; ++i) {\n            res.push(fn(arr[i], i));\n        }\n        return res;\n    }\n\n    function hasOwnProp(a, b) {\n        return Object.prototype.hasOwnProperty.call(a, b);\n    }\n\n    function extend(a, b) {\n        for (var i in b) {\n            if (hasOwnProp(b, i)) {\n                a[i] = b[i];\n            }\n        }\n\n        if (hasOwnProp(b, 'toString')) {\n            a.toString = b.toString;\n        }\n\n        if (hasOwnProp(b, 'valueOf')) {\n            a.valueOf = b.valueOf;\n        }\n\n        return a;\n    }\n\n    function create_utc__createUTC (input, format, locale, strict) {\n        return createLocalOrUTC(input, format, locale, strict, true).utc();\n    }\n\n    function defaultParsingFlags() {\n        // We need to deep clone this object.\n        return {\n            empty           : false,\n            unusedTokens    : [],\n            unusedInput     : [],\n            overflow        : -2,\n            charsLeftOver   : 0,\n            nullInput       : false,\n            invalidMonth    : null,\n            invalidFormat   : false,\n            userInvalidated : false,\n            iso             : false,\n            parsedDateParts : [],\n            meridiem        : null\n        };\n    }\n\n    function getParsingFlags(m) {\n        if (m._pf == null) {\n            m._pf = defaultParsingFlags();\n        }\n        return m._pf;\n    }\n\n    var some;\n    if (Array.prototype.some) {\n        some = Array.prototype.some;\n    } else {\n        some = function (fun) {\n            var t = Object(this);\n            var len = t.length >>> 0;\n\n            for (var i = 0; i < len; i++) {\n                if (i in t && fun.call(this, t[i], i, t)) {\n                    return true;\n                }\n            }\n\n            return false;\n        };\n    }\n\n    function valid__isValid(m) {\n        if (m._isValid == null) {\n            var flags = getParsingFlags(m);\n            var parsedParts = some.call(flags.parsedDateParts, function (i) {\n                return i != null;\n            });\n            var isNowValid = !isNaN(m._d.getTime()) &&\n                flags.overflow < 0 &&\n                !flags.empty &&\n                !flags.invalidMonth &&\n                !flags.invalidWeekday &&\n                !flags.nullInput &&\n                !flags.invalidFormat &&\n                !flags.userInvalidated &&\n                (!flags.meridiem || (flags.meridiem && parsedParts));\n\n            if (m._strict) {\n                isNowValid = isNowValid &&\n                    flags.charsLeftOver === 0 &&\n                    flags.unusedTokens.length === 0 &&\n                    flags.bigHour === undefined;\n            }\n\n            if (Object.isFrozen == null || !Object.isFrozen(m)) {\n                m._isValid = isNowValid;\n            }\n            else {\n                return isNowValid;\n            }\n        }\n        return m._isValid;\n    }\n\n    function valid__createInvalid (flags) {\n        var m = create_utc__createUTC(NaN);\n        if (flags != null) {\n            extend(getParsingFlags(m), flags);\n        }\n        else {\n            getParsingFlags(m).userInvalidated = true;\n        }\n\n        return m;\n    }\n\n    function isUndefined(input) {\n        return input === void 0;\n    }\n\n    // Plugins that add properties should also add the key here (null value),\n    // so we can properly clone ourselves.\n    var momentProperties = utils_hooks__hooks.momentProperties = [];\n\n    function copyConfig(to, from) {\n        var i, prop, val;\n\n        if (!isUndefined(from._isAMomentObject)) {\n            to._isAMomentObject = from._isAMomentObject;\n        }\n        if (!isUndefined(from._i)) {\n            to._i = from._i;\n        }\n        if (!isUndefined(from._f)) {\n            to._f = from._f;\n        }\n        if (!isUndefined(from._l)) {\n            to._l = from._l;\n        }\n        if (!isUndefined(from._strict)) {\n            to._strict = from._strict;\n        }\n        if (!isUndefined(from._tzm)) {\n            to._tzm = from._tzm;\n        }\n        if (!isUndefined(from._isUTC)) {\n            to._isUTC = from._isUTC;\n        }\n        if (!isUndefined(from._offset)) {\n            to._offset = from._offset;\n        }\n        if (!isUndefined(from._pf)) {\n            to._pf = getParsingFlags(from);\n        }\n        if (!isUndefined(from._locale)) {\n            to._locale = from._locale;\n        }\n\n        if (momentProperties.length > 0) {\n            for (i in momentProperties) {\n                prop = momentProperties[i];\n                val = from[prop];\n                if (!isUndefined(val)) {\n                    to[prop] = val;\n                }\n            }\n        }\n\n        return to;\n    }\n\n    var updateInProgress = false;\n\n    // Moment prototype object\n    function Moment(config) {\n        copyConfig(this, config);\n        this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n        // Prevent infinite loop in case updateOffset creates new moment\n        // objects.\n        if (updateInProgress === false) {\n            updateInProgress = true;\n            utils_hooks__hooks.updateOffset(this);\n            updateInProgress = false;\n        }\n    }\n\n    function isMoment (obj) {\n        return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);\n    }\n\n    function absFloor (number) {\n        if (number < 0) {\n            // -0 -> 0\n            return Math.ceil(number) || 0;\n        } else {\n            return Math.floor(number);\n        }\n    }\n\n    function toInt(argumentForCoercion) {\n        var coercedNumber = +argumentForCoercion,\n            value = 0;\n\n        if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n            value = absFloor(coercedNumber);\n        }\n\n        return value;\n    }\n\n    // compare two arrays, return the number of differences\n    function compareArrays(array1, array2, dontConvert) {\n        var len = Math.min(array1.length, array2.length),\n            lengthDiff = Math.abs(array1.length - array2.length),\n            diffs = 0,\n            i;\n        for (i = 0; i < len; i++) {\n            if ((dontConvert && array1[i] !== array2[i]) ||\n                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {\n                diffs++;\n            }\n        }\n        return diffs + lengthDiff;\n    }\n\n    function warn(msg) {\n        if (utils_hooks__hooks.suppressDeprecationWarnings === false &&\n                (typeof console !==  'undefined') && console.warn) {\n            console.warn('Deprecation warning: ' + msg);\n        }\n    }\n\n    function deprecate(msg, fn) {\n        var firstTime = true;\n\n        return extend(function () {\n            if (utils_hooks__hooks.deprecationHandler != null) {\n                utils_hooks__hooks.deprecationHandler(null, msg);\n            }\n            if (firstTime) {\n                var args = [];\n                var arg;\n                for (var i = 0; i < arguments.length; i++) {\n                    arg = '';\n                    if (typeof arguments[i] === 'object') {\n                        arg += '\\n[' + i + '] ';\n                        for (var key in arguments[0]) {\n                            arg += key + ': ' + arguments[0][key] + ', ';\n                        }\n                        arg = arg.slice(0, -2); // Remove trailing comma and space\n                    } else {\n                        arg = arguments[i];\n                    }\n                    args.push(arg);\n                }\n                warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + (new Error()).stack);\n                firstTime = false;\n            }\n            return fn.apply(this, arguments);\n        }, fn);\n    }\n\n    var deprecations = {};\n\n    function deprecateSimple(name, msg) {\n        if (utils_hooks__hooks.deprecationHandler != null) {\n            utils_hooks__hooks.deprecationHandler(name, msg);\n        }\n        if (!deprecations[name]) {\n            warn(msg);\n            deprecations[name] = true;\n        }\n    }\n\n    utils_hooks__hooks.suppressDeprecationWarnings = false;\n    utils_hooks__hooks.deprecationHandler = null;\n\n    function isFunction(input) {\n        return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n    }\n\n    function locale_set__set (config) {\n        var prop, i;\n        for (i in config) {\n            prop = config[i];\n            if (isFunction(prop)) {\n                this[i] = prop;\n            } else {\n                this['_' + i] = prop;\n            }\n        }\n        this._config = config;\n        // Lenient ordinal parsing accepts just a number in addition to\n        // number + (possibly) stuff coming from _ordinalParseLenient.\n        this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + (/\\d{1,2}/).source);\n    }\n\n    function mergeConfigs(parentConfig, childConfig) {\n        var res = extend({}, parentConfig), prop;\n        for (prop in childConfig) {\n            if (hasOwnProp(childConfig, prop)) {\n                if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n                    res[prop] = {};\n                    extend(res[prop], parentConfig[prop]);\n                    extend(res[prop], childConfig[prop]);\n                } else if (childConfig[prop] != null) {\n                    res[prop] = childConfig[prop];\n                } else {\n                    delete res[prop];\n                }\n            }\n        }\n        for (prop in parentConfig) {\n            if (hasOwnProp(parentConfig, prop) &&\n                    !hasOwnProp(childConfig, prop) &&\n                    isObject(parentConfig[prop])) {\n                // make sure changes to properties don't modify parent config\n                res[prop] = extend({}, res[prop]);\n            }\n        }\n        return res;\n    }\n\n    function Locale(config) {\n        if (config != null) {\n            this.set(config);\n        }\n    }\n\n    var keys;\n\n    if (Object.keys) {\n        keys = Object.keys;\n    } else {\n        keys = function (obj) {\n            var i, res = [];\n            for (i in obj) {\n                if (hasOwnProp(obj, i)) {\n                    res.push(i);\n                }\n            }\n            return res;\n        };\n    }\n\n    var defaultCalendar = {\n        sameDay : '[Today at] LT',\n        nextDay : '[Tomorrow at] LT',\n        nextWeek : 'dddd [at] LT',\n        lastDay : '[Yesterday at] LT',\n        lastWeek : '[Last] dddd [at] LT',\n        sameElse : 'L'\n    };\n\n    function locale_calendar__calendar (key, mom, now) {\n        var output = this._calendar[key] || this._calendar['sameElse'];\n        return isFunction(output) ? output.call(mom, now) : output;\n    }\n\n    var defaultLongDateFormat = {\n        LTS  : 'h:mm:ss A',\n        LT   : 'h:mm A',\n        L    : 'MM/DD/YYYY',\n        LL   : 'MMMM D, YYYY',\n        LLL  : 'MMMM D, YYYY h:mm A',\n        LLLL : 'dddd, MMMM D, YYYY h:mm A'\n    };\n\n    function longDateFormat (key) {\n        var format = this._longDateFormat[key],\n            formatUpper = this._longDateFormat[key.toUpperCase()];\n\n        if (format || !formatUpper) {\n            return format;\n        }\n\n        this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {\n            return val.slice(1);\n        });\n\n        return this._longDateFormat[key];\n    }\n\n    var defaultInvalidDate = 'Invalid date';\n\n    function invalidDate () {\n        return this._invalidDate;\n    }\n\n    var defaultOrdinal = '%d';\n    var defaultOrdinalParse = /\\d{1,2}/;\n\n    function ordinal (number) {\n        return this._ordinal.replace('%d', number);\n    }\n\n    var defaultRelativeTime = {\n        future : 'in %s',\n        past   : '%s ago',\n        s  : 'a few seconds',\n        m  : 'a minute',\n        mm : '%d minutes',\n        h  : 'an hour',\n        hh : '%d hours',\n        d  : 'a day',\n        dd : '%d days',\n        M  : 'a month',\n        MM : '%d months',\n        y  : 'a year',\n        yy : '%d years'\n    };\n\n    function relative__relativeTime (number, withoutSuffix, string, isFuture) {\n        var output = this._relativeTime[string];\n        return (isFunction(output)) ?\n            output(number, withoutSuffix, string, isFuture) :\n            output.replace(/%d/i, number);\n    }\n\n    function pastFuture (diff, output) {\n        var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n        return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n    }\n\n    var aliases = {};\n\n    function addUnitAlias (unit, shorthand) {\n        var lowerCase = unit.toLowerCase();\n        aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n    }\n\n    function normalizeUnits(units) {\n        return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n    }\n\n    function normalizeObjectUnits(inputObject) {\n        var normalizedInput = {},\n            normalizedProp,\n            prop;\n\n        for (prop in inputObject) {\n            if (hasOwnProp(inputObject, prop)) {\n                normalizedProp = normalizeUnits(prop);\n                if (normalizedProp) {\n                    normalizedInput[normalizedProp] = inputObject[prop];\n                }\n            }\n        }\n\n        return normalizedInput;\n    }\n\n    var priorities = {};\n\n    function addUnitPriority(unit, priority) {\n        priorities[unit] = priority;\n    }\n\n    function getPrioritizedUnits(unitsObj) {\n        var units = [];\n        for (var u in unitsObj) {\n            units.push({unit: u, priority: priorities[u]});\n        }\n        units.sort(function (a, b) {\n            return a.priority - b.priority;\n        });\n        return units;\n    }\n\n    function makeGetSet (unit, keepTime) {\n        return function (value) {\n            if (value != null) {\n                get_set__set(this, unit, value);\n                utils_hooks__hooks.updateOffset(this, keepTime);\n                return this;\n            } else {\n                return get_set__get(this, unit);\n            }\n        };\n    }\n\n    function get_set__get (mom, unit) {\n        return mom.isValid() ?\n            mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;\n    }\n\n    function get_set__set (mom, unit, value) {\n        if (mom.isValid()) {\n            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n        }\n    }\n\n    // MOMENTS\n\n    function stringGet (units) {\n        units = normalizeUnits(units);\n        if (isFunction(this[units])) {\n            return this[units]();\n        }\n        return this;\n    }\n\n\n    function stringSet (units, value) {\n        if (typeof units === 'object') {\n            units = normalizeObjectUnits(units);\n            var prioritized = getPrioritizedUnits(units);\n            for (var i = 0; i < prioritized.length; i++) {\n                this[prioritized[i].unit](units[prioritized[i].unit]);\n            }\n        } else {\n            units = normalizeUnits(units);\n            if (isFunction(this[units])) {\n                return this[units](value);\n            }\n        }\n        return this;\n    }\n\n    function zeroFill(number, targetLength, forceSign) {\n        var absNumber = '' + Math.abs(number),\n            zerosToFill = targetLength - absNumber.length,\n            sign = number >= 0;\n        return (sign ? (forceSign ? '+' : '') : '-') +\n            Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n    }\n\n    var formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;\n\n    var localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g;\n\n    var formatFunctions = {};\n\n    var formatTokenFunctions = {};\n\n    // token:    'M'\n    // padded:   ['MM', 2]\n    // ordinal:  'Mo'\n    // callback: function () { this.month() + 1 }\n    function addFormatToken (token, padded, ordinal, callback) {\n        var func = callback;\n        if (typeof callback === 'string') {\n            func = function () {\n                return this[callback]();\n            };\n        }\n        if (token) {\n            formatTokenFunctions[token] = func;\n        }\n        if (padded) {\n            formatTokenFunctions[padded[0]] = function () {\n                return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n            };\n        }\n        if (ordinal) {\n            formatTokenFunctions[ordinal] = function () {\n                return this.localeData().ordinal(func.apply(this, arguments), token);\n            };\n        }\n    }\n\n    function removeFormattingTokens(input) {\n        if (input.match(/\\[[\\s\\S]/)) {\n            return input.replace(/^\\[|\\]$/g, '');\n        }\n        return input.replace(/\\\\/g, '');\n    }\n\n    function makeFormatFunction(format) {\n        var array = format.match(formattingTokens), i, length;\n\n        for (i = 0, length = array.length; i < length; i++) {\n            if (formatTokenFunctions[array[i]]) {\n                array[i] = formatTokenFunctions[array[i]];\n            } else {\n                array[i] = removeFormattingTokens(array[i]);\n            }\n        }\n\n        return function (mom) {\n            var output = '', i;\n            for (i = 0; i < length; i++) {\n                output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];\n            }\n            return output;\n        };\n    }\n\n    // format date using native date object\n    function formatMoment(m, format) {\n        if (!m.isValid()) {\n            return m.localeData().invalidDate();\n        }\n\n        format = expandFormat(format, m.localeData());\n        formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n\n        return formatFunctions[format](m);\n    }\n\n    function expandFormat(format, locale) {\n        var i = 5;\n\n        function replaceLongDateFormatTokens(input) {\n            return locale.longDateFormat(input) || input;\n        }\n\n        localFormattingTokens.lastIndex = 0;\n        while (i >= 0 && localFormattingTokens.test(format)) {\n            format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n            localFormattingTokens.lastIndex = 0;\n            i -= 1;\n        }\n\n        return format;\n    }\n\n    var match1         = /\\d/;            //       0 - 9\n    var match2         = /\\d\\d/;          //      00 - 99\n    var match3         = /\\d{3}/;         //     000 - 999\n    var match4         = /\\d{4}/;         //    0000 - 9999\n    var match6         = /[+-]?\\d{6}/;    // -999999 - 999999\n    var match1to2      = /\\d\\d?/;         //       0 - 99\n    var match3to4      = /\\d\\d\\d\\d?/;     //     999 - 9999\n    var match5to6      = /\\d\\d\\d\\d\\d\\d?/; //   99999 - 999999\n    var match1to3      = /\\d{1,3}/;       //       0 - 999\n    var match1to4      = /\\d{1,4}/;       //       0 - 9999\n    var match1to6      = /[+-]?\\d{1,6}/;  // -999999 - 999999\n\n    var matchUnsigned  = /\\d+/;           //       0 - inf\n    var matchSigned    = /[+-]?\\d+/;      //    -inf - inf\n\n    var matchOffset    = /Z|[+-]\\d\\d:?\\d\\d/gi; // +00:00 -00:00 +0000 -0000 or Z\n    var matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n\n    var matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/; // 123456789 123456789.123\n\n    // any word (or two) characters or numbers including two/three word month in arabic.\n    // includes scottish gaelic two word and hyphenated months\n    var matchWord = /[0-9]*['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+|[\\u0600-\\u06FF\\/]+(\\s*?[\\u0600-\\u06FF]+){1,2}/i;\n\n\n    var regexes = {};\n\n    function addRegexToken (token, regex, strictRegex) {\n        regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n            return (isStrict && strictRegex) ? strictRegex : regex;\n        };\n    }\n\n    function getParseRegexForToken (token, config) {\n        if (!hasOwnProp(regexes, token)) {\n            return new RegExp(unescapeFormat(token));\n        }\n\n        return regexes[token](config._strict, config._locale);\n    }\n\n    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n    function unescapeFormat(s) {\n        return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n            return p1 || p2 || p3 || p4;\n        }));\n    }\n\n    function regexEscape(s) {\n        return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n    }\n\n    var tokens = {};\n\n    function addParseToken (token, callback) {\n        var i, func = callback;\n        if (typeof token === 'string') {\n            token = [token];\n        }\n        if (typeof callback === 'number') {\n            func = function (input, array) {\n                array[callback] = toInt(input);\n            };\n        }\n        for (i = 0; i < token.length; i++) {\n            tokens[token[i]] = func;\n        }\n    }\n\n    function addWeekParseToken (token, callback) {\n        addParseToken(token, function (input, array, config, token) {\n            config._w = config._w || {};\n            callback(input, config._w, config, token);\n        });\n    }\n\n    function addTimeToArrayFromToken(token, input, config) {\n        if (input != null && hasOwnProp(tokens, token)) {\n            tokens[token](input, config._a, config, token);\n        }\n    }\n\n    var YEAR = 0;\n    var MONTH = 1;\n    var DATE = 2;\n    var HOUR = 3;\n    var MINUTE = 4;\n    var SECOND = 5;\n    var MILLISECOND = 6;\n    var WEEK = 7;\n    var WEEKDAY = 8;\n\n    var indexOf;\n\n    if (Array.prototype.indexOf) {\n        indexOf = Array.prototype.indexOf;\n    } else {\n        indexOf = function (o) {\n            // I know\n            var i;\n            for (i = 0; i < this.length; ++i) {\n                if (this[i] === o) {\n                    return i;\n                }\n            }\n            return -1;\n        };\n    }\n\n    function daysInMonth(year, month) {\n        return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n    }\n\n    // FORMATTING\n\n    addFormatToken('M', ['MM', 2], 'Mo', function () {\n        return this.month() + 1;\n    });\n\n    addFormatToken('MMM', 0, 0, function (format) {\n        return this.localeData().monthsShort(this, format);\n    });\n\n    addFormatToken('MMMM', 0, 0, function (format) {\n        return this.localeData().months(this, format);\n    });\n\n    // ALIASES\n\n    addUnitAlias('month', 'M');\n\n    // PRIORITY\n\n    addUnitPriority('month', 8);\n\n    // PARSING\n\n    addRegexToken('M',    match1to2);\n    addRegexToken('MM',   match1to2, match2);\n    addRegexToken('MMM',  function (isStrict, locale) {\n        return locale.monthsShortRegex(isStrict);\n    });\n    addRegexToken('MMMM', function (isStrict, locale) {\n        return locale.monthsRegex(isStrict);\n    });\n\n    addParseToken(['M', 'MM'], function (input, array) {\n        array[MONTH] = toInt(input) - 1;\n    });\n\n    addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n        var month = config._locale.monthsParse(input, token, config._strict);\n        // if we didn't find a month name, mark the date as invalid.\n        if (month != null) {\n            array[MONTH] = month;\n        } else {\n            getParsingFlags(config).invalidMonth = input;\n        }\n    });\n\n    // LOCALES\n\n    var MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s+)+MMMM?/;\n    var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');\n    function localeMonths (m, format) {\n        if (!m) {\n            return this._months;\n        }\n        return isArray(this._months) ? this._months[m.month()] :\n            this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n    }\n\n    var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');\n    function localeMonthsShort (m, format) {\n        if (!m) {\n            return this._monthsShort;\n        }\n        return isArray(this._monthsShort) ? this._monthsShort[m.month()] :\n            this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n    }\n\n    function units_month__handleStrictParse(monthName, format, strict) {\n        var i, ii, mom, llc = monthName.toLocaleLowerCase();\n        if (!this._monthsParse) {\n            // this is not used\n            this._monthsParse = [];\n            this._longMonthsParse = [];\n            this._shortMonthsParse = [];\n            for (i = 0; i < 12; ++i) {\n                mom = create_utc__createUTC([2000, i]);\n                this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n                this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n            }\n        }\n\n        if (strict) {\n            if (format === 'MMM') {\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._longMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        } else {\n            if (format === 'MMM') {\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._longMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._longMonthsParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        }\n    }\n\n    function localeMonthsParse (monthName, format, strict) {\n        var i, mom, regex;\n\n        if (this._monthsParseExact) {\n            return units_month__handleStrictParse.call(this, monthName, format, strict);\n        }\n\n        if (!this._monthsParse) {\n            this._monthsParse = [];\n            this._longMonthsParse = [];\n            this._shortMonthsParse = [];\n        }\n\n        // TODO: add sorting\n        // Sorting makes sure if one month (or abbr) is a prefix of another\n        // see sorting in computeMonthsParse\n        for (i = 0; i < 12; i++) {\n            // make the regex if we don't have it already\n            mom = create_utc__createUTC([2000, i]);\n            if (strict && !this._longMonthsParse[i]) {\n                this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n                this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n            }\n            if (!strict && !this._monthsParse[i]) {\n                regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n                this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n            }\n            // test the regex\n            if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n                return i;\n            } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n                return i;\n            } else if (!strict && this._monthsParse[i].test(monthName)) {\n                return i;\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function setMonth (mom, value) {\n        var dayOfMonth;\n\n        if (!mom.isValid()) {\n            // No op\n            return mom;\n        }\n\n        if (typeof value === 'string') {\n            if (/^\\d+$/.test(value)) {\n                value = toInt(value);\n            } else {\n                value = mom.localeData().monthsParse(value);\n                // TODO: Another silent failure?\n                if (typeof value !== 'number') {\n                    return mom;\n                }\n            }\n        }\n\n        dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n        mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n        return mom;\n    }\n\n    function getSetMonth (value) {\n        if (value != null) {\n            setMonth(this, value);\n            utils_hooks__hooks.updateOffset(this, true);\n            return this;\n        } else {\n            return get_set__get(this, 'Month');\n        }\n    }\n\n    function getDaysInMonth () {\n        return daysInMonth(this.year(), this.month());\n    }\n\n    var defaultMonthsShortRegex = matchWord;\n    function monthsShortRegex (isStrict) {\n        if (this._monthsParseExact) {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                computeMonthsParse.call(this);\n            }\n            if (isStrict) {\n                return this._monthsShortStrictRegex;\n            } else {\n                return this._monthsShortRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_monthsShortRegex')) {\n                this._monthsShortRegex = defaultMonthsShortRegex;\n            }\n            return this._monthsShortStrictRegex && isStrict ?\n                this._monthsShortStrictRegex : this._monthsShortRegex;\n        }\n    }\n\n    var defaultMonthsRegex = matchWord;\n    function monthsRegex (isStrict) {\n        if (this._monthsParseExact) {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                computeMonthsParse.call(this);\n            }\n            if (isStrict) {\n                return this._monthsStrictRegex;\n            } else {\n                return this._monthsRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                this._monthsRegex = defaultMonthsRegex;\n            }\n            return this._monthsStrictRegex && isStrict ?\n                this._monthsStrictRegex : this._monthsRegex;\n        }\n    }\n\n    function computeMonthsParse () {\n        function cmpLenRev(a, b) {\n            return b.length - a.length;\n        }\n\n        var shortPieces = [], longPieces = [], mixedPieces = [],\n            i, mom;\n        for (i = 0; i < 12; i++) {\n            // make the regex if we don't have it already\n            mom = create_utc__createUTC([2000, i]);\n            shortPieces.push(this.monthsShort(mom, ''));\n            longPieces.push(this.months(mom, ''));\n            mixedPieces.push(this.months(mom, ''));\n            mixedPieces.push(this.monthsShort(mom, ''));\n        }\n        // Sorting makes sure if one month (or abbr) is a prefix of another it\n        // will match the longer piece.\n        shortPieces.sort(cmpLenRev);\n        longPieces.sort(cmpLenRev);\n        mixedPieces.sort(cmpLenRev);\n        for (i = 0; i < 12; i++) {\n            shortPieces[i] = regexEscape(shortPieces[i]);\n            longPieces[i] = regexEscape(longPieces[i]);\n        }\n        for (i = 0; i < 24; i++) {\n            mixedPieces[i] = regexEscape(mixedPieces[i]);\n        }\n\n        this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n        this._monthsShortRegex = this._monthsRegex;\n        this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n        this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n    }\n\n    // FORMATTING\n\n    addFormatToken('Y', 0, 0, function () {\n        var y = this.year();\n        return y <= 9999 ? '' + y : '+' + y;\n    });\n\n    addFormatToken(0, ['YY', 2], 0, function () {\n        return this.year() % 100;\n    });\n\n    addFormatToken(0, ['YYYY',   4],       0, 'year');\n    addFormatToken(0, ['YYYYY',  5],       0, 'year');\n    addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n    // ALIASES\n\n    addUnitAlias('year', 'y');\n\n    // PRIORITIES\n\n    addUnitPriority('year', 1);\n\n    // PARSING\n\n    addRegexToken('Y',      matchSigned);\n    addRegexToken('YY',     match1to2, match2);\n    addRegexToken('YYYY',   match1to4, match4);\n    addRegexToken('YYYYY',  match1to6, match6);\n    addRegexToken('YYYYYY', match1to6, match6);\n\n    addParseToken(['YYYYY', 'YYYYYY'], YEAR);\n    addParseToken('YYYY', function (input, array) {\n        array[YEAR] = input.length === 2 ? utils_hooks__hooks.parseTwoDigitYear(input) : toInt(input);\n    });\n    addParseToken('YY', function (input, array) {\n        array[YEAR] = utils_hooks__hooks.parseTwoDigitYear(input);\n    });\n    addParseToken('Y', function (input, array) {\n        array[YEAR] = parseInt(input, 10);\n    });\n\n    // HELPERS\n\n    function daysInYear(year) {\n        return isLeapYear(year) ? 366 : 365;\n    }\n\n    function isLeapYear(year) {\n        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n    }\n\n    // HOOKS\n\n    utils_hooks__hooks.parseTwoDigitYear = function (input) {\n        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n    };\n\n    // MOMENTS\n\n    var getSetYear = makeGetSet('FullYear', true);\n\n    function getIsLeapYear () {\n        return isLeapYear(this.year());\n    }\n\n    function createDate (y, m, d, h, M, s, ms) {\n        //can't just apply() to create a date:\n        //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply\n        var date = new Date(y, m, d, h, M, s, ms);\n\n        //the date constructor remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {\n            date.setFullYear(y);\n        }\n        return date;\n    }\n\n    function createUTCDate (y) {\n        var date = new Date(Date.UTC.apply(null, arguments));\n\n        //the Date.UTC function remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {\n            date.setUTCFullYear(y);\n        }\n        return date;\n    }\n\n    // start-of-first-week - start-of-year\n    function firstWeekOffset(year, dow, doy) {\n        var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n            fwd = 7 + dow - doy,\n            // first-week day local weekday -- which local weekday is fwd\n            fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n        return -fwdlw + fwd - 1;\n    }\n\n    //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n    function dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n        var localWeekday = (7 + weekday - dow) % 7,\n            weekOffset = firstWeekOffset(year, dow, doy),\n            dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n            resYear, resDayOfYear;\n\n        if (dayOfYear <= 0) {\n            resYear = year - 1;\n            resDayOfYear = daysInYear(resYear) + dayOfYear;\n        } else if (dayOfYear > daysInYear(year)) {\n            resYear = year + 1;\n            resDayOfYear = dayOfYear - daysInYear(year);\n        } else {\n            resYear = year;\n            resDayOfYear = dayOfYear;\n        }\n\n        return {\n            year: resYear,\n            dayOfYear: resDayOfYear\n        };\n    }\n\n    function weekOfYear(mom, dow, doy) {\n        var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n            week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n            resWeek, resYear;\n\n        if (week < 1) {\n            resYear = mom.year() - 1;\n            resWeek = week + weeksInYear(resYear, dow, doy);\n        } else if (week > weeksInYear(mom.year(), dow, doy)) {\n            resWeek = week - weeksInYear(mom.year(), dow, doy);\n            resYear = mom.year() + 1;\n        } else {\n            resYear = mom.year();\n            resWeek = week;\n        }\n\n        return {\n            week: resWeek,\n            year: resYear\n        };\n    }\n\n    function weeksInYear(year, dow, doy) {\n        var weekOffset = firstWeekOffset(year, dow, doy),\n            weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n        return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n    }\n\n    // FORMATTING\n\n    addFormatToken('w', ['ww', 2], 'wo', 'week');\n    addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n    // ALIASES\n\n    addUnitAlias('week', 'w');\n    addUnitAlias('isoWeek', 'W');\n\n    // PRIORITIES\n\n    addUnitPriority('week', 5);\n    addUnitPriority('isoWeek', 5);\n\n    // PARSING\n\n    addRegexToken('w',  match1to2);\n    addRegexToken('ww', match1to2, match2);\n    addRegexToken('W',  match1to2);\n    addRegexToken('WW', match1to2, match2);\n\n    addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n        week[token.substr(0, 1)] = toInt(input);\n    });\n\n    // HELPERS\n\n    // LOCALES\n\n    function localeWeek (mom) {\n        return weekOfYear(mom, this._week.dow, this._week.doy).week;\n    }\n\n    var defaultLocaleWeek = {\n        dow : 0, // Sunday is the first day of the week.\n        doy : 6  // The week that contains Jan 1st is the first week of the year.\n    };\n\n    function localeFirstDayOfWeek () {\n        return this._week.dow;\n    }\n\n    function localeFirstDayOfYear () {\n        return this._week.doy;\n    }\n\n    // MOMENTS\n\n    function getSetWeek (input) {\n        var week = this.localeData().week(this);\n        return input == null ? week : this.add((input - week) * 7, 'd');\n    }\n\n    function getSetISOWeek (input) {\n        var week = weekOfYear(this, 1, 4).week;\n        return input == null ? week : this.add((input - week) * 7, 'd');\n    }\n\n    // FORMATTING\n\n    addFormatToken('d', 0, 'do', 'day');\n\n    addFormatToken('dd', 0, 0, function (format) {\n        return this.localeData().weekdaysMin(this, format);\n    });\n\n    addFormatToken('ddd', 0, 0, function (format) {\n        return this.localeData().weekdaysShort(this, format);\n    });\n\n    addFormatToken('dddd', 0, 0, function (format) {\n        return this.localeData().weekdays(this, format);\n    });\n\n    addFormatToken('e', 0, 0, 'weekday');\n    addFormatToken('E', 0, 0, 'isoWeekday');\n\n    // ALIASES\n\n    addUnitAlias('day', 'd');\n    addUnitAlias('weekday', 'e');\n    addUnitAlias('isoWeekday', 'E');\n\n    // PRIORITY\n    addUnitPriority('day', 11);\n    addUnitPriority('weekday', 11);\n    addUnitPriority('isoWeekday', 11);\n\n    // PARSING\n\n    addRegexToken('d',    match1to2);\n    addRegexToken('e',    match1to2);\n    addRegexToken('E',    match1to2);\n    addRegexToken('dd',   function (isStrict, locale) {\n        return locale.weekdaysMinRegex(isStrict);\n    });\n    addRegexToken('ddd',   function (isStrict, locale) {\n        return locale.weekdaysShortRegex(isStrict);\n    });\n    addRegexToken('dddd',   function (isStrict, locale) {\n        return locale.weekdaysRegex(isStrict);\n    });\n\n    addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n        var weekday = config._locale.weekdaysParse(input, token, config._strict);\n        // if we didn't get a weekday name, mark the date as invalid\n        if (weekday != null) {\n            week.d = weekday;\n        } else {\n            getParsingFlags(config).invalidWeekday = input;\n        }\n    });\n\n    addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n        week[token] = toInt(input);\n    });\n\n    // HELPERS\n\n    function parseWeekday(input, locale) {\n        if (typeof input !== 'string') {\n            return input;\n        }\n\n        if (!isNaN(input)) {\n            return parseInt(input, 10);\n        }\n\n        input = locale.weekdaysParse(input);\n        if (typeof input === 'number') {\n            return input;\n        }\n\n        return null;\n    }\n\n    function parseIsoWeekday(input, locale) {\n        if (typeof input === 'string') {\n            return locale.weekdaysParse(input) % 7 || 7;\n        }\n        return isNaN(input) ? null : input;\n    }\n\n    // LOCALES\n\n    var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');\n    function localeWeekdays (m, format) {\n        if (!m) {\n            return this._weekdays;\n        }\n        return isArray(this._weekdays) ? this._weekdays[m.day()] :\n            this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];\n    }\n\n    var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');\n    function localeWeekdaysShort (m) {\n        return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n    }\n\n    var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');\n    function localeWeekdaysMin (m) {\n        return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n    }\n\n    function day_of_week__handleStrictParse(weekdayName, format, strict) {\n        var i, ii, mom, llc = weekdayName.toLocaleLowerCase();\n        if (!this._weekdaysParse) {\n            this._weekdaysParse = [];\n            this._shortWeekdaysParse = [];\n            this._minWeekdaysParse = [];\n\n            for (i = 0; i < 7; ++i) {\n                mom = create_utc__createUTC([2000, 1]).day(i);\n                this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n                this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n                this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n            }\n        }\n\n        if (strict) {\n            if (format === 'dddd') {\n                ii = indexOf.call(this._weekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else if (format === 'ddd') {\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        } else {\n            if (format === 'dddd') {\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else if (format === 'ddd') {\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        }\n    }\n\n    function localeWeekdaysParse (weekdayName, format, strict) {\n        var i, mom, regex;\n\n        if (this._weekdaysParseExact) {\n            return day_of_week__handleStrictParse.call(this, weekdayName, format, strict);\n        }\n\n        if (!this._weekdaysParse) {\n            this._weekdaysParse = [];\n            this._minWeekdaysParse = [];\n            this._shortWeekdaysParse = [];\n            this._fullWeekdaysParse = [];\n        }\n\n        for (i = 0; i < 7; i++) {\n            // make the regex if we don't have it already\n\n            mom = create_utc__createUTC([2000, 1]).day(i);\n            if (strict && !this._fullWeekdaysParse[i]) {\n                this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i');\n                this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i');\n                this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i');\n            }\n            if (!this._weekdaysParse[i]) {\n                regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n                this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n            }\n            // test the regex\n            if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n                return i;\n            } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n                return i;\n            } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n                return i;\n            } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n                return i;\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function getSetDayOfWeek (input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n        if (input != null) {\n            input = parseWeekday(input, this.localeData());\n            return this.add(input - day, 'd');\n        } else {\n            return day;\n        }\n    }\n\n    function getSetLocaleDayOfWeek (input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n        return input == null ? weekday : this.add(input - weekday, 'd');\n    }\n\n    function getSetISODayOfWeek (input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n\n        // behaves the same as moment#day except\n        // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n        // as a setter, sunday should belong to the previous week.\n\n        if (input != null) {\n            var weekday = parseIsoWeekday(input, this.localeData());\n            return this.day(this.day() % 7 ? weekday : weekday - 7);\n        } else {\n            return this.day() || 7;\n        }\n    }\n\n    var defaultWeekdaysRegex = matchWord;\n    function weekdaysRegex (isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysStrictRegex;\n            } else {\n                return this._weekdaysRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                this._weekdaysRegex = defaultWeekdaysRegex;\n            }\n            return this._weekdaysStrictRegex && isStrict ?\n                this._weekdaysStrictRegex : this._weekdaysRegex;\n        }\n    }\n\n    var defaultWeekdaysShortRegex = matchWord;\n    function weekdaysShortRegex (isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysShortStrictRegex;\n            } else {\n                return this._weekdaysShortRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n                this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n            }\n            return this._weekdaysShortStrictRegex && isStrict ?\n                this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n        }\n    }\n\n    var defaultWeekdaysMinRegex = matchWord;\n    function weekdaysMinRegex (isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysMinStrictRegex;\n            } else {\n                return this._weekdaysMinRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n                this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n            }\n            return this._weekdaysMinStrictRegex && isStrict ?\n                this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n        }\n    }\n\n\n    function computeWeekdaysParse () {\n        function cmpLenRev(a, b) {\n            return b.length - a.length;\n        }\n\n        var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],\n            i, mom, minp, shortp, longp;\n        for (i = 0; i < 7; i++) {\n            // make the regex if we don't have it already\n            mom = create_utc__createUTC([2000, 1]).day(i);\n            minp = this.weekdaysMin(mom, '');\n            shortp = this.weekdaysShort(mom, '');\n            longp = this.weekdays(mom, '');\n            minPieces.push(minp);\n            shortPieces.push(shortp);\n            longPieces.push(longp);\n            mixedPieces.push(minp);\n            mixedPieces.push(shortp);\n            mixedPieces.push(longp);\n        }\n        // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n        // will match the longer piece.\n        minPieces.sort(cmpLenRev);\n        shortPieces.sort(cmpLenRev);\n        longPieces.sort(cmpLenRev);\n        mixedPieces.sort(cmpLenRev);\n        for (i = 0; i < 7; i++) {\n            shortPieces[i] = regexEscape(shortPieces[i]);\n            longPieces[i] = regexEscape(longPieces[i]);\n            mixedPieces[i] = regexEscape(mixedPieces[i]);\n        }\n\n        this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n        this._weekdaysShortRegex = this._weekdaysRegex;\n        this._weekdaysMinRegex = this._weekdaysRegex;\n\n        this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n        this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n        this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n    }\n\n    // FORMATTING\n\n    function hFormat() {\n        return this.hours() % 12 || 12;\n    }\n\n    function kFormat() {\n        return this.hours() || 24;\n    }\n\n    addFormatToken('H', ['HH', 2], 0, 'hour');\n    addFormatToken('h', ['hh', 2], 0, hFormat);\n    addFormatToken('k', ['kk', 2], 0, kFormat);\n\n    addFormatToken('hmm', 0, 0, function () {\n        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n    });\n\n    addFormatToken('hmmss', 0, 0, function () {\n        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +\n            zeroFill(this.seconds(), 2);\n    });\n\n    addFormatToken('Hmm', 0, 0, function () {\n        return '' + this.hours() + zeroFill(this.minutes(), 2);\n    });\n\n    addFormatToken('Hmmss', 0, 0, function () {\n        return '' + this.hours() + zeroFill(this.minutes(), 2) +\n            zeroFill(this.seconds(), 2);\n    });\n\n    function meridiem (token, lowercase) {\n        addFormatToken(token, 0, 0, function () {\n            return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n        });\n    }\n\n    meridiem('a', true);\n    meridiem('A', false);\n\n    // ALIASES\n\n    addUnitAlias('hour', 'h');\n\n    // PRIORITY\n    addUnitPriority('hour', 13);\n\n    // PARSING\n\n    function matchMeridiem (isStrict, locale) {\n        return locale._meridiemParse;\n    }\n\n    addRegexToken('a',  matchMeridiem);\n    addRegexToken('A',  matchMeridiem);\n    addRegexToken('H',  match1to2);\n    addRegexToken('h',  match1to2);\n    addRegexToken('HH', match1to2, match2);\n    addRegexToken('hh', match1to2, match2);\n\n    addRegexToken('hmm', match3to4);\n    addRegexToken('hmmss', match5to6);\n    addRegexToken('Hmm', match3to4);\n    addRegexToken('Hmmss', match5to6);\n\n    addParseToken(['H', 'HH'], HOUR);\n    addParseToken(['a', 'A'], function (input, array, config) {\n        config._isPm = config._locale.isPM(input);\n        config._meridiem = input;\n    });\n    addParseToken(['h', 'hh'], function (input, array, config) {\n        array[HOUR] = toInt(input);\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('hmm', function (input, array, config) {\n        var pos = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos));\n        array[MINUTE] = toInt(input.substr(pos));\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('hmmss', function (input, array, config) {\n        var pos1 = input.length - 4;\n        var pos2 = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos1));\n        array[MINUTE] = toInt(input.substr(pos1, 2));\n        array[SECOND] = toInt(input.substr(pos2));\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('Hmm', function (input, array, config) {\n        var pos = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos));\n        array[MINUTE] = toInt(input.substr(pos));\n    });\n    addParseToken('Hmmss', function (input, array, config) {\n        var pos1 = input.length - 4;\n        var pos2 = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos1));\n        array[MINUTE] = toInt(input.substr(pos1, 2));\n        array[SECOND] = toInt(input.substr(pos2));\n    });\n\n    // LOCALES\n\n    function localeIsPM (input) {\n        // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n        // Using charAt should be more compatible.\n        return ((input + '').toLowerCase().charAt(0) === 'p');\n    }\n\n    var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i;\n    function localeMeridiem (hours, minutes, isLower) {\n        if (hours > 11) {\n            return isLower ? 'pm' : 'PM';\n        } else {\n            return isLower ? 'am' : 'AM';\n        }\n    }\n\n\n    // MOMENTS\n\n    // Setting the hour should keep the time, because the user explicitly\n    // specified which hour he wants. So trying to maintain the same hour (in\n    // a new timezone) makes sense. Adding/subtracting hours does not follow\n    // this rule.\n    var getSetHour = makeGetSet('Hours', true);\n\n    var baseConfig = {\n        calendar: defaultCalendar,\n        longDateFormat: defaultLongDateFormat,\n        invalidDate: defaultInvalidDate,\n        ordinal: defaultOrdinal,\n        ordinalParse: defaultOrdinalParse,\n        relativeTime: defaultRelativeTime,\n\n        months: defaultLocaleMonths,\n        monthsShort: defaultLocaleMonthsShort,\n\n        week: defaultLocaleWeek,\n\n        weekdays: defaultLocaleWeekdays,\n        weekdaysMin: defaultLocaleWeekdaysMin,\n        weekdaysShort: defaultLocaleWeekdaysShort,\n\n        meridiemParse: defaultLocaleMeridiemParse\n    };\n\n    // internal storage for locale config files\n    var locales = {};\n    var globalLocale;\n\n    function normalizeLocale(key) {\n        return key ? key.toLowerCase().replace('_', '-') : key;\n    }\n\n    // pick the locale from the array\n    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n    function chooseLocale(names) {\n        var i = 0, j, next, locale, split;\n\n        while (i < names.length) {\n            split = normalizeLocale(names[i]).split('-');\n            j = split.length;\n            next = normalizeLocale(names[i + 1]);\n            next = next ? next.split('-') : null;\n            while (j > 0) {\n                locale = loadLocale(split.slice(0, j).join('-'));\n                if (locale) {\n                    return locale;\n                }\n                if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {\n                    //the next array item is better than a shallower substring of this one\n                    break;\n                }\n                j--;\n            }\n            i++;\n        }\n        return null;\n    }\n\n    function loadLocale(name) {\n        var oldLocale = null;\n        // TODO: Find a better way to register and load all the locales in Node\n        if (!locales[name] && (typeof module !== 'undefined') &&\n                module && module.exports) {\n            try {\n                oldLocale = globalLocale._abbr;\n                require('./locale/' + name);\n                // because defineLocale currently also sets the global locale, we\n                // want to undo that for lazy loaded locales\n                locale_locales__getSetGlobalLocale(oldLocale);\n            } catch (e) { }\n        }\n        return locales[name];\n    }\n\n    // This function will load locale and then set the global locale.  If\n    // no arguments are passed in, it will simply return the current global\n    // locale key.\n    function locale_locales__getSetGlobalLocale (key, values) {\n        var data;\n        if (key) {\n            if (isUndefined(values)) {\n                data = locale_locales__getLocale(key);\n            }\n            else {\n                data = defineLocale(key, values);\n            }\n\n            if (data) {\n                // moment.duration._locale = moment._locale = data;\n                globalLocale = data;\n            }\n        }\n\n        return globalLocale._abbr;\n    }\n\n    function defineLocale (name, config) {\n        if (config !== null) {\n            var parentConfig = baseConfig;\n            config.abbr = name;\n            if (locales[name] != null) {\n                deprecateSimple('defineLocaleOverride',\n                        'use moment.updateLocale(localeName, config) to change ' +\n                        'an existing locale. moment.defineLocale(localeName, ' +\n                        'config) should only be used for creating a new locale ' +\n                        'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n                parentConfig = locales[name]._config;\n            } else if (config.parentLocale != null) {\n                if (locales[config.parentLocale] != null) {\n                    parentConfig = locales[config.parentLocale]._config;\n                } else {\n                    // treat as if there is no base config\n                    deprecateSimple('parentLocaleUndefined',\n                            'specified parentLocale is not defined yet. See http://momentjs.com/guides/#/warnings/parent-locale/');\n                }\n            }\n            locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n            // backwards compat for now: also set the locale\n            locale_locales__getSetGlobalLocale(name);\n\n            return locales[name];\n        } else {\n            // useful for testing\n            delete locales[name];\n            return null;\n        }\n    }\n\n    function updateLocale(name, config) {\n        if (config != null) {\n            var locale, parentConfig = baseConfig;\n            // MERGE\n            if (locales[name] != null) {\n                parentConfig = locales[name]._config;\n            }\n            config = mergeConfigs(parentConfig, config);\n            locale = new Locale(config);\n            locale.parentLocale = locales[name];\n            locales[name] = locale;\n\n            // backwards compat for now: also set the locale\n            locale_locales__getSetGlobalLocale(name);\n        } else {\n            // pass null for config to unupdate, useful for tests\n            if (locales[name] != null) {\n                if (locales[name].parentLocale != null) {\n                    locales[name] = locales[name].parentLocale;\n                } else if (locales[name] != null) {\n                    delete locales[name];\n                }\n            }\n        }\n        return locales[name];\n    }\n\n    // returns locale data\n    function locale_locales__getLocale (key) {\n        var locale;\n\n        if (key && key._locale && key._locale._abbr) {\n            key = key._locale._abbr;\n        }\n\n        if (!key) {\n            return globalLocale;\n        }\n\n        if (!isArray(key)) {\n            //short-circuit everything else\n            locale = loadLocale(key);\n            if (locale) {\n                return locale;\n            }\n            key = [key];\n        }\n\n        return chooseLocale(key);\n    }\n\n    function locale_locales__listLocales() {\n        return keys(locales);\n    }\n\n    function checkOverflow (m) {\n        var overflow;\n        var a = m._a;\n\n        if (a && getParsingFlags(m).overflow === -2) {\n            overflow =\n                a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :\n                a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :\n                a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :\n                a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :\n                a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :\n                a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :\n                -1;\n\n            if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n                overflow = DATE;\n            }\n            if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n                overflow = WEEK;\n            }\n            if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n                overflow = WEEKDAY;\n            }\n\n            getParsingFlags(m).overflow = overflow;\n        }\n\n        return m;\n    }\n\n    // iso 8601 regex\n    // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\n    var extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?/;\n    var basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?/;\n\n    var tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/;\n\n    var isoDates = [\n        ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n        ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n        ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n        ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n        ['YYYY-DDD', /\\d{4}-\\d{3}/],\n        ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n        ['YYYYYYMMDD', /[+-]\\d{10}/],\n        ['YYYYMMDD', /\\d{8}/],\n        // YYYYMM is NOT allowed by the standard\n        ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n        ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n        ['YYYYDDD', /\\d{7}/]\n    ];\n\n    // iso time formats and regexes\n    var isoTimes = [\n        ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n        ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n        ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n        ['HH:mm', /\\d\\d:\\d\\d/],\n        ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n        ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n        ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n        ['HHmm', /\\d\\d\\d\\d/],\n        ['HH', /\\d\\d/]\n    ];\n\n    var aspNetJsonRegex = /^\\/?Date\\((\\-?\\d+)/i;\n\n    // date from iso format\n    function configFromISO(config) {\n        var i, l,\n            string = config._i,\n            match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n            allowTime, dateFormat, timeFormat, tzFormat;\n\n        if (match) {\n            getParsingFlags(config).iso = true;\n\n            for (i = 0, l = isoDates.length; i < l; i++) {\n                if (isoDates[i][1].exec(match[1])) {\n                    dateFormat = isoDates[i][0];\n                    allowTime = isoDates[i][2] !== false;\n                    break;\n                }\n            }\n            if (dateFormat == null) {\n                config._isValid = false;\n                return;\n            }\n            if (match[3]) {\n                for (i = 0, l = isoTimes.length; i < l; i++) {\n                    if (isoTimes[i][1].exec(match[3])) {\n                        // match[2] should be 'T' or space\n                        timeFormat = (match[2] || ' ') + isoTimes[i][0];\n                        break;\n                    }\n                }\n                if (timeFormat == null) {\n                    config._isValid = false;\n                    return;\n                }\n            }\n            if (!allowTime && timeFormat != null) {\n                config._isValid = false;\n                return;\n            }\n            if (match[4]) {\n                if (tzRegex.exec(match[4])) {\n                    tzFormat = 'Z';\n                } else {\n                    config._isValid = false;\n                    return;\n                }\n            }\n            config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n            configFromStringAndFormat(config);\n        } else {\n            config._isValid = false;\n        }\n    }\n\n    // date from iso format or fallback\n    function configFromString(config) {\n        var matched = aspNetJsonRegex.exec(config._i);\n\n        if (matched !== null) {\n            config._d = new Date(+matched[1]);\n            return;\n        }\n\n        configFromISO(config);\n        if (config._isValid === false) {\n            delete config._isValid;\n            utils_hooks__hooks.createFromInputFallback(config);\n        }\n    }\n\n    utils_hooks__hooks.createFromInputFallback = deprecate(\n        'value provided is not in a recognized ISO format. moment construction falls back to js Date(), ' +\n        'which is not reliable across all browsers and versions. Non ISO date formats are ' +\n        'discouraged and will be removed in an upcoming major release. Please refer to ' +\n        'http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n        function (config) {\n            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n        }\n    );\n\n    // Pick the first defined of two or three arguments.\n    function defaults(a, b, c) {\n        if (a != null) {\n            return a;\n        }\n        if (b != null) {\n            return b;\n        }\n        return c;\n    }\n\n    function currentDateArray(config) {\n        // hooks is actually the exported moment object\n        var nowValue = new Date(utils_hooks__hooks.now());\n        if (config._useUTC) {\n            return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n        }\n        return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n    }\n\n    // convert an array to a date.\n    // the array should mirror the parameters below\n    // note: all values past the year are optional and will default to the lowest possible value.\n    // [year, month, day , hour, minute, second, millisecond]\n    function configFromArray (config) {\n        var i, date, input = [], currentDate, yearToUse;\n\n        if (config._d) {\n            return;\n        }\n\n        currentDate = currentDateArray(config);\n\n        //compute day of the year from weeks and weekdays\n        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n            dayOfYearFromWeekInfo(config);\n        }\n\n        //if the day of the year is set, figure out what it is\n        if (config._dayOfYear) {\n            yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n            if (config._dayOfYear > daysInYear(yearToUse)) {\n                getParsingFlags(config)._overflowDayOfYear = true;\n            }\n\n            date = createUTCDate(yearToUse, 0, config._dayOfYear);\n            config._a[MONTH] = date.getUTCMonth();\n            config._a[DATE] = date.getUTCDate();\n        }\n\n        // Default to current date.\n        // * if no year, month, day of month are given, default to today\n        // * if day of month is given, default month and year\n        // * if month is given, default only year\n        // * if year is given, don't default anything\n        for (i = 0; i < 3 && config._a[i] == null; ++i) {\n            config._a[i] = input[i] = currentDate[i];\n        }\n\n        // Zero out whatever was not defaulted, including time\n        for (; i < 7; i++) {\n            config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];\n        }\n\n        // Check for 24:00:00.000\n        if (config._a[HOUR] === 24 &&\n                config._a[MINUTE] === 0 &&\n                config._a[SECOND] === 0 &&\n                config._a[MILLISECOND] === 0) {\n            config._nextDay = true;\n            config._a[HOUR] = 0;\n        }\n\n        config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n        // Apply timezone offset from input. The actual utcOffset can be changed\n        // with parseZone.\n        if (config._tzm != null) {\n            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n        }\n\n        if (config._nextDay) {\n            config._a[HOUR] = 24;\n        }\n    }\n\n    function dayOfYearFromWeekInfo(config) {\n        var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;\n\n        w = config._w;\n        if (w.GG != null || w.W != null || w.E != null) {\n            dow = 1;\n            doy = 4;\n\n            // TODO: We need to take the current isoWeekYear, but that depends on\n            // how we interpret now (local, utc, fixed offset). So create\n            // a now version of current config (take local/utc/offset flags, and\n            // create now).\n            weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(local__createLocal(), 1, 4).year);\n            week = defaults(w.W, 1);\n            weekday = defaults(w.E, 1);\n            if (weekday < 1 || weekday > 7) {\n                weekdayOverflow = true;\n            }\n        } else {\n            dow = config._locale._week.dow;\n            doy = config._locale._week.doy;\n\n            weekYear = defaults(w.gg, config._a[YEAR], weekOfYear(local__createLocal(), dow, doy).year);\n            week = defaults(w.w, 1);\n\n            if (w.d != null) {\n                // weekday -- low day numbers are considered next week\n                weekday = w.d;\n                if (weekday < 0 || weekday > 6) {\n                    weekdayOverflow = true;\n                }\n            } else if (w.e != null) {\n                // local weekday -- counting starts from begining of week\n                weekday = w.e + dow;\n                if (w.e < 0 || w.e > 6) {\n                    weekdayOverflow = true;\n                }\n            } else {\n                // default to begining of week\n                weekday = dow;\n            }\n        }\n        if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n            getParsingFlags(config)._overflowWeeks = true;\n        } else if (weekdayOverflow != null) {\n            getParsingFlags(config)._overflowWeekday = true;\n        } else {\n            temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n            config._a[YEAR] = temp.year;\n            config._dayOfYear = temp.dayOfYear;\n        }\n    }\n\n    // constant that refers to the ISO standard\n    utils_hooks__hooks.ISO_8601 = function () {};\n\n    // date from string and format string\n    function configFromStringAndFormat(config) {\n        // TODO: Move this to another part of the creation flow to prevent circular deps\n        if (config._f === utils_hooks__hooks.ISO_8601) {\n            configFromISO(config);\n            return;\n        }\n\n        config._a = [];\n        getParsingFlags(config).empty = true;\n\n        // This array is used to make a Date, either with `new Date` or `Date.UTC`\n        var string = '' + config._i,\n            i, parsedInput, tokens, token, skipped,\n            stringLength = string.length,\n            totalParsedInputLength = 0;\n\n        tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n\n        for (i = 0; i < tokens.length; i++) {\n            token = tokens[i];\n            parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n            // console.log('token', token, 'parsedInput', parsedInput,\n            //         'regex', getParseRegexForToken(token, config));\n            if (parsedInput) {\n                skipped = string.substr(0, string.indexOf(parsedInput));\n                if (skipped.length > 0) {\n                    getParsingFlags(config).unusedInput.push(skipped);\n                }\n                string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n                totalParsedInputLength += parsedInput.length;\n            }\n            // don't parse if it's not a known token\n            if (formatTokenFunctions[token]) {\n                if (parsedInput) {\n                    getParsingFlags(config).empty = false;\n                }\n                else {\n                    getParsingFlags(config).unusedTokens.push(token);\n                }\n                addTimeToArrayFromToken(token, parsedInput, config);\n            }\n            else if (config._strict && !parsedInput) {\n                getParsingFlags(config).unusedTokens.push(token);\n            }\n        }\n\n        // add remaining unparsed input length to the string\n        getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n        if (string.length > 0) {\n            getParsingFlags(config).unusedInput.push(string);\n        }\n\n        // clear _12h flag if hour is <= 12\n        if (config._a[HOUR] <= 12 &&\n            getParsingFlags(config).bigHour === true &&\n            config._a[HOUR] > 0) {\n            getParsingFlags(config).bigHour = undefined;\n        }\n\n        getParsingFlags(config).parsedDateParts = config._a.slice(0);\n        getParsingFlags(config).meridiem = config._meridiem;\n        // handle meridiem\n        config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n        configFromArray(config);\n        checkOverflow(config);\n    }\n\n\n    function meridiemFixWrap (locale, hour, meridiem) {\n        var isPm;\n\n        if (meridiem == null) {\n            // nothing to do\n            return hour;\n        }\n        if (locale.meridiemHour != null) {\n            return locale.meridiemHour(hour, meridiem);\n        } else if (locale.isPM != null) {\n            // Fallback\n            isPm = locale.isPM(meridiem);\n            if (isPm && hour < 12) {\n                hour += 12;\n            }\n            if (!isPm && hour === 12) {\n                hour = 0;\n            }\n            return hour;\n        } else {\n            // this is not supposed to happen\n            return hour;\n        }\n    }\n\n    // date from string and array of format strings\n    function configFromStringAndArray(config) {\n        var tempConfig,\n            bestMoment,\n\n            scoreToBeat,\n            i,\n            currentScore;\n\n        if (config._f.length === 0) {\n            getParsingFlags(config).invalidFormat = true;\n            config._d = new Date(NaN);\n            return;\n        }\n\n        for (i = 0; i < config._f.length; i++) {\n            currentScore = 0;\n            tempConfig = copyConfig({}, config);\n            if (config._useUTC != null) {\n                tempConfig._useUTC = config._useUTC;\n            }\n            tempConfig._f = config._f[i];\n            configFromStringAndFormat(tempConfig);\n\n            if (!valid__isValid(tempConfig)) {\n                continue;\n            }\n\n            // if there is any input that was not parsed add a penalty for that format\n            currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n            //or tokens\n            currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n            getParsingFlags(tempConfig).score = currentScore;\n\n            if (scoreToBeat == null || currentScore < scoreToBeat) {\n                scoreToBeat = currentScore;\n                bestMoment = tempConfig;\n            }\n        }\n\n        extend(config, bestMoment || tempConfig);\n    }\n\n    function configFromObject(config) {\n        if (config._d) {\n            return;\n        }\n\n        var i = normalizeObjectUnits(config._i);\n        config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n            return obj && parseInt(obj, 10);\n        });\n\n        configFromArray(config);\n    }\n\n    function createFromConfig (config) {\n        var res = new Moment(checkOverflow(prepareConfig(config)));\n        if (res._nextDay) {\n            // Adding is smart enough around DST\n            res.add(1, 'd');\n            res._nextDay = undefined;\n        }\n\n        return res;\n    }\n\n    function prepareConfig (config) {\n        var input = config._i,\n            format = config._f;\n\n        config._locale = config._locale || locale_locales__getLocale(config._l);\n\n        if (input === null || (format === undefined && input === '')) {\n            return valid__createInvalid({nullInput: true});\n        }\n\n        if (typeof input === 'string') {\n            config._i = input = config._locale.preparse(input);\n        }\n\n        if (isMoment(input)) {\n            return new Moment(checkOverflow(input));\n        } else if (isArray(format)) {\n            configFromStringAndArray(config);\n        } else if (isDate(input)) {\n            config._d = input;\n        } else if (format) {\n            configFromStringAndFormat(config);\n        }  else {\n            configFromInput(config);\n        }\n\n        if (!valid__isValid(config)) {\n            config._d = null;\n        }\n\n        return config;\n    }\n\n    function configFromInput(config) {\n        var input = config._i;\n        if (input === undefined) {\n            config._d = new Date(utils_hooks__hooks.now());\n        } else if (isDate(input)) {\n            config._d = new Date(input.valueOf());\n        } else if (typeof input === 'string') {\n            configFromString(config);\n        } else if (isArray(input)) {\n            config._a = map(input.slice(0), function (obj) {\n                return parseInt(obj, 10);\n            });\n            configFromArray(config);\n        } else if (typeof(input) === 'object') {\n            configFromObject(config);\n        } else if (typeof(input) === 'number') {\n            // from milliseconds\n            config._d = new Date(input);\n        } else {\n            utils_hooks__hooks.createFromInputFallback(config);\n        }\n    }\n\n    function createLocalOrUTC (input, format, locale, strict, isUTC) {\n        var c = {};\n\n        if (typeof(locale) === 'boolean') {\n            strict = locale;\n            locale = undefined;\n        }\n\n        if ((isObject(input) && isObjectEmpty(input)) ||\n                (isArray(input) && input.length === 0)) {\n            input = undefined;\n        }\n        // object construction must be done this way.\n        // https://github.com/moment/moment/issues/1423\n        c._isAMomentObject = true;\n        c._useUTC = c._isUTC = isUTC;\n        c._l = locale;\n        c._i = input;\n        c._f = format;\n        c._strict = strict;\n\n        return createFromConfig(c);\n    }\n\n    function local__createLocal (input, format, locale, strict) {\n        return createLocalOrUTC(input, format, locale, strict, false);\n    }\n\n    var prototypeMin = deprecate(\n        'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n        function () {\n            var other = local__createLocal.apply(null, arguments);\n            if (this.isValid() && other.isValid()) {\n                return other < this ? this : other;\n            } else {\n                return valid__createInvalid();\n            }\n        }\n    );\n\n    var prototypeMax = deprecate(\n        'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n        function () {\n            var other = local__createLocal.apply(null, arguments);\n            if (this.isValid() && other.isValid()) {\n                return other > this ? this : other;\n            } else {\n                return valid__createInvalid();\n            }\n        }\n    );\n\n    // Pick a moment m from moments so that m[fn](other) is true for all\n    // other. This relies on the function fn to be transitive.\n    //\n    // moments should either be an array of moment objects or an array, whose\n    // first element is an array of moment objects.\n    function pickBy(fn, moments) {\n        var res, i;\n        if (moments.length === 1 && isArray(moments[0])) {\n            moments = moments[0];\n        }\n        if (!moments.length) {\n            return local__createLocal();\n        }\n        res = moments[0];\n        for (i = 1; i < moments.length; ++i) {\n            if (!moments[i].isValid() || moments[i][fn](res)) {\n                res = moments[i];\n            }\n        }\n        return res;\n    }\n\n    // TODO: Use [].sort instead?\n    function min () {\n        var args = [].slice.call(arguments, 0);\n\n        return pickBy('isBefore', args);\n    }\n\n    function max () {\n        var args = [].slice.call(arguments, 0);\n\n        return pickBy('isAfter', args);\n    }\n\n    var now = function () {\n        return Date.now ? Date.now() : +(new Date());\n    };\n\n    function Duration (duration) {\n        var normalizedInput = normalizeObjectUnits(duration),\n            years = normalizedInput.year || 0,\n            quarters = normalizedInput.quarter || 0,\n            months = normalizedInput.month || 0,\n            weeks = normalizedInput.week || 0,\n            days = normalizedInput.day || 0,\n            hours = normalizedInput.hour || 0,\n            minutes = normalizedInput.minute || 0,\n            seconds = normalizedInput.second || 0,\n            milliseconds = normalizedInput.millisecond || 0;\n\n        // representation for dateAddRemove\n        this._milliseconds = +milliseconds +\n            seconds * 1e3 + // 1000\n            minutes * 6e4 + // 1000 * 60\n            hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n        // Because of dateAddRemove treats 24 hours as different from a\n        // day when working around DST, we need to store them separately\n        this._days = +days +\n            weeks * 7;\n        // It is impossible translate months into days without knowing\n        // which months you are are talking about, so we have to store\n        // it separately.\n        this._months = +months +\n            quarters * 3 +\n            years * 12;\n\n        this._data = {};\n\n        this._locale = locale_locales__getLocale();\n\n        this._bubble();\n    }\n\n    function isDuration (obj) {\n        return obj instanceof Duration;\n    }\n\n    function absRound (number) {\n        if (number < 0) {\n            return Math.round(-1 * number) * -1;\n        } else {\n            return Math.round(number);\n        }\n    }\n\n    // FORMATTING\n\n    function offset (token, separator) {\n        addFormatToken(token, 0, 0, function () {\n            var offset = this.utcOffset();\n            var sign = '+';\n            if (offset < 0) {\n                offset = -offset;\n                sign = '-';\n            }\n            return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);\n        });\n    }\n\n    offset('Z', ':');\n    offset('ZZ', '');\n\n    // PARSING\n\n    addRegexToken('Z',  matchShortOffset);\n    addRegexToken('ZZ', matchShortOffset);\n    addParseToken(['Z', 'ZZ'], function (input, array, config) {\n        config._useUTC = true;\n        config._tzm = offsetFromString(matchShortOffset, input);\n    });\n\n    // HELPERS\n\n    // timezone chunker\n    // '+10:00' > ['10',  '00']\n    // '-1530'  > ['-15', '30']\n    var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\n    function offsetFromString(matcher, string) {\n        var matches = ((string || '').match(matcher) || []);\n        var chunk   = matches[matches.length - 1] || [];\n        var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n        var minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n        return parts[0] === '+' ? minutes : -minutes;\n    }\n\n    // Return a moment from input, that is local/utc/zone equivalent to model.\n    function cloneWithOffset(input, model) {\n        var res, diff;\n        if (model._isUTC) {\n            res = model.clone();\n            diff = (isMoment(input) || isDate(input) ? input.valueOf() : local__createLocal(input).valueOf()) - res.valueOf();\n            // Use low-level api, because this fn is low-level api.\n            res._d.setTime(res._d.valueOf() + diff);\n            utils_hooks__hooks.updateOffset(res, false);\n            return res;\n        } else {\n            return local__createLocal(input).local();\n        }\n    }\n\n    function getDateOffset (m) {\n        // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n        // https://github.com/moment/moment/pull/1871\n        return -Math.round(m._d.getTimezoneOffset() / 15) * 15;\n    }\n\n    // HOOKS\n\n    // This function will be called whenever a moment is mutated.\n    // It is intended to keep the offset in sync with the timezone.\n    utils_hooks__hooks.updateOffset = function () {};\n\n    // MOMENTS\n\n    // keepLocalTime = true means only change the timezone, without\n    // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n    // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n    // +0200, so we adjust the time as needed, to be valid.\n    //\n    // Keeping the time actually adds/subtracts (one hour)\n    // from the actual represented time. That is why we call updateOffset\n    // a second time. In case it wants us to change the offset again\n    // _changeInProgress == true case, then we have to adjust, because\n    // there is no such time in the given timezone.\n    function getSetOffset (input, keepLocalTime) {\n        var offset = this._offset || 0,\n            localAdjust;\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        if (input != null) {\n            if (typeof input === 'string') {\n                input = offsetFromString(matchShortOffset, input);\n            } else if (Math.abs(input) < 16) {\n                input = input * 60;\n            }\n            if (!this._isUTC && keepLocalTime) {\n                localAdjust = getDateOffset(this);\n            }\n            this._offset = input;\n            this._isUTC = true;\n            if (localAdjust != null) {\n                this.add(localAdjust, 'm');\n            }\n            if (offset !== input) {\n                if (!keepLocalTime || this._changeInProgress) {\n                    add_subtract__addSubtract(this, create__createDuration(input - offset, 'm'), 1, false);\n                } else if (!this._changeInProgress) {\n                    this._changeInProgress = true;\n                    utils_hooks__hooks.updateOffset(this, true);\n                    this._changeInProgress = null;\n                }\n            }\n            return this;\n        } else {\n            return this._isUTC ? offset : getDateOffset(this);\n        }\n    }\n\n    function getSetZone (input, keepLocalTime) {\n        if (input != null) {\n            if (typeof input !== 'string') {\n                input = -input;\n            }\n\n            this.utcOffset(input, keepLocalTime);\n\n            return this;\n        } else {\n            return -this.utcOffset();\n        }\n    }\n\n    function setOffsetToUTC (keepLocalTime) {\n        return this.utcOffset(0, keepLocalTime);\n    }\n\n    function setOffsetToLocal (keepLocalTime) {\n        if (this._isUTC) {\n            this.utcOffset(0, keepLocalTime);\n            this._isUTC = false;\n\n            if (keepLocalTime) {\n                this.subtract(getDateOffset(this), 'm');\n            }\n        }\n        return this;\n    }\n\n    function setOffsetToParsedOffset () {\n        if (this._tzm) {\n            this.utcOffset(this._tzm);\n        } else if (typeof this._i === 'string') {\n            var tZone = offsetFromString(matchOffset, this._i);\n\n            if (tZone === 0) {\n                this.utcOffset(0, true);\n            } else {\n                this.utcOffset(offsetFromString(matchOffset, this._i));\n            }\n        }\n        return this;\n    }\n\n    function hasAlignedHourOffset (input) {\n        if (!this.isValid()) {\n            return false;\n        }\n        input = input ? local__createLocal(input).utcOffset() : 0;\n\n        return (this.utcOffset() - input) % 60 === 0;\n    }\n\n    function isDaylightSavingTime () {\n        return (\n            this.utcOffset() > this.clone().month(0).utcOffset() ||\n            this.utcOffset() > this.clone().month(5).utcOffset()\n        );\n    }\n\n    function isDaylightSavingTimeShifted () {\n        if (!isUndefined(this._isDSTShifted)) {\n            return this._isDSTShifted;\n        }\n\n        var c = {};\n\n        copyConfig(c, this);\n        c = prepareConfig(c);\n\n        if (c._a) {\n            var other = c._isUTC ? create_utc__createUTC(c._a) : local__createLocal(c._a);\n            this._isDSTShifted = this.isValid() &&\n                compareArrays(c._a, other.toArray()) > 0;\n        } else {\n            this._isDSTShifted = false;\n        }\n\n        return this._isDSTShifted;\n    }\n\n    function isLocal () {\n        return this.isValid() ? !this._isUTC : false;\n    }\n\n    function isUtcOffset () {\n        return this.isValid() ? this._isUTC : false;\n    }\n\n    function isUtc () {\n        return this.isValid() ? this._isUTC && this._offset === 0 : false;\n    }\n\n    // ASP.NET json date format regex\n    var aspNetRegex = /^(\\-)?(?:(\\d*)[. ])?(\\d+)\\:(\\d+)(?:\\:(\\d+)(\\.\\d*)?)?$/;\n\n    // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n    // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n    // and further modified to allow for strings containing both week and day\n    var isoRegex = /^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;\n\n    function create__createDuration (input, key) {\n        var duration = input,\n            // matching against regexp is expensive, do it on demand\n            match = null,\n            sign,\n            ret,\n            diffRes;\n\n        if (isDuration(input)) {\n            duration = {\n                ms : input._milliseconds,\n                d  : input._days,\n                M  : input._months\n            };\n        } else if (typeof input === 'number') {\n            duration = {};\n            if (key) {\n                duration[key] = input;\n            } else {\n                duration.milliseconds = input;\n            }\n        } else if (!!(match = aspNetRegex.exec(input))) {\n            sign = (match[1] === '-') ? -1 : 1;\n            duration = {\n                y  : 0,\n                d  : toInt(match[DATE])                         * sign,\n                h  : toInt(match[HOUR])                         * sign,\n                m  : toInt(match[MINUTE])                       * sign,\n                s  : toInt(match[SECOND])                       * sign,\n                ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n            };\n        } else if (!!(match = isoRegex.exec(input))) {\n            sign = (match[1] === '-') ? -1 : 1;\n            duration = {\n                y : parseIso(match[2], sign),\n                M : parseIso(match[3], sign),\n                w : parseIso(match[4], sign),\n                d : parseIso(match[5], sign),\n                h : parseIso(match[6], sign),\n                m : parseIso(match[7], sign),\n                s : parseIso(match[8], sign)\n            };\n        } else if (duration == null) {// checks for null or undefined\n            duration = {};\n        } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n            diffRes = momentsDifference(local__createLocal(duration.from), local__createLocal(duration.to));\n\n            duration = {};\n            duration.ms = diffRes.milliseconds;\n            duration.M = diffRes.months;\n        }\n\n        ret = new Duration(duration);\n\n        if (isDuration(input) && hasOwnProp(input, '_locale')) {\n            ret._locale = input._locale;\n        }\n\n        return ret;\n    }\n\n    create__createDuration.fn = Duration.prototype;\n\n    function parseIso (inp, sign) {\n        // We'd normally use ~~inp for this, but unfortunately it also\n        // converts floats to ints.\n        // inp may be undefined, so careful calling replace on it.\n        var res = inp && parseFloat(inp.replace(',', '.'));\n        // apply sign while we're at it\n        return (isNaN(res) ? 0 : res) * sign;\n    }\n\n    function positiveMomentsDifference(base, other) {\n        var res = {milliseconds: 0, months: 0};\n\n        res.months = other.month() - base.month() +\n            (other.year() - base.year()) * 12;\n        if (base.clone().add(res.months, 'M').isAfter(other)) {\n            --res.months;\n        }\n\n        res.milliseconds = +other - +(base.clone().add(res.months, 'M'));\n\n        return res;\n    }\n\n    function momentsDifference(base, other) {\n        var res;\n        if (!(base.isValid() && other.isValid())) {\n            return {milliseconds: 0, months: 0};\n        }\n\n        other = cloneWithOffset(other, base);\n        if (base.isBefore(other)) {\n            res = positiveMomentsDifference(base, other);\n        } else {\n            res = positiveMomentsDifference(other, base);\n            res.milliseconds = -res.milliseconds;\n            res.months = -res.months;\n        }\n\n        return res;\n    }\n\n    // TODO: remove 'name' arg after deprecation is removed\n    function createAdder(direction, name) {\n        return function (val, period) {\n            var dur, tmp;\n            //invert the arguments, but complain about it\n            if (period !== null && !isNaN(+period)) {\n                deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +\n                'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n                tmp = val; val = period; period = tmp;\n            }\n\n            val = typeof val === 'string' ? +val : val;\n            dur = create__createDuration(val, period);\n            add_subtract__addSubtract(this, dur, direction);\n            return this;\n        };\n    }\n\n    function add_subtract__addSubtract (mom, duration, isAdding, updateOffset) {\n        var milliseconds = duration._milliseconds,\n            days = absRound(duration._days),\n            months = absRound(duration._months);\n\n        if (!mom.isValid()) {\n            // No op\n            return;\n        }\n\n        updateOffset = updateOffset == null ? true : updateOffset;\n\n        if (milliseconds) {\n            mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n        }\n        if (days) {\n            get_set__set(mom, 'Date', get_set__get(mom, 'Date') + days * isAdding);\n        }\n        if (months) {\n            setMonth(mom, get_set__get(mom, 'Month') + months * isAdding);\n        }\n        if (updateOffset) {\n            utils_hooks__hooks.updateOffset(mom, days || months);\n        }\n    }\n\n    var add_subtract__add      = createAdder(1, 'add');\n    var add_subtract__subtract = createAdder(-1, 'subtract');\n\n    function getCalendarFormat(myMoment, now) {\n        var diff = myMoment.diff(now, 'days', true);\n        return diff < -6 ? 'sameElse' :\n                diff < -1 ? 'lastWeek' :\n                diff < 0 ? 'lastDay' :\n                diff < 1 ? 'sameDay' :\n                diff < 2 ? 'nextDay' :\n                diff < 7 ? 'nextWeek' : 'sameElse';\n    }\n\n    function moment_calendar__calendar (time, formats) {\n        // We want to compare the start of today, vs this.\n        // Getting start-of-today depends on whether we're local/utc/offset or not.\n        var now = time || local__createLocal(),\n            sod = cloneWithOffset(now, this).startOf('day'),\n            format = utils_hooks__hooks.calendarFormat(this, sod) || 'sameElse';\n\n        var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n\n        return this.format(output || this.localeData().calendar(format, this, local__createLocal(now)));\n    }\n\n    function clone () {\n        return new Moment(this);\n    }\n\n    function isAfter (input, units) {\n        var localInput = isMoment(input) ? input : local__createLocal(input);\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n        if (units === 'millisecond') {\n            return this.valueOf() > localInput.valueOf();\n        } else {\n            return localInput.valueOf() < this.clone().startOf(units).valueOf();\n        }\n    }\n\n    function isBefore (input, units) {\n        var localInput = isMoment(input) ? input : local__createLocal(input);\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');\n        if (units === 'millisecond') {\n            return this.valueOf() < localInput.valueOf();\n        } else {\n            return this.clone().endOf(units).valueOf() < localInput.valueOf();\n        }\n    }\n\n    function isBetween (from, to, units, inclusivity) {\n        inclusivity = inclusivity || '()';\n        return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&\n            (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));\n    }\n\n    function isSame (input, units) {\n        var localInput = isMoment(input) ? input : local__createLocal(input),\n            inputMs;\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(units || 'millisecond');\n        if (units === 'millisecond') {\n            return this.valueOf() === localInput.valueOf();\n        } else {\n            inputMs = localInput.valueOf();\n            return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n        }\n    }\n\n    function isSameOrAfter (input, units) {\n        return this.isSame(input, units) || this.isAfter(input,units);\n    }\n\n    function isSameOrBefore (input, units) {\n        return this.isSame(input, units) || this.isBefore(input,units);\n    }\n\n    function diff (input, units, asFloat) {\n        var that,\n            zoneDelta,\n            delta, output;\n\n        if (!this.isValid()) {\n            return NaN;\n        }\n\n        that = cloneWithOffset(input, this);\n\n        if (!that.isValid()) {\n            return NaN;\n        }\n\n        zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n        units = normalizeUnits(units);\n\n        if (units === 'year' || units === 'month' || units === 'quarter') {\n            output = monthDiff(this, that);\n            if (units === 'quarter') {\n                output = output / 3;\n            } else if (units === 'year') {\n                output = output / 12;\n            }\n        } else {\n            delta = this - that;\n            output = units === 'second' ? delta / 1e3 : // 1000\n                units === 'minute' ? delta / 6e4 : // 1000 * 60\n                units === 'hour' ? delta / 36e5 : // 1000 * 60 * 60\n                units === 'day' ? (delta - zoneDelta) / 864e5 : // 1000 * 60 * 60 * 24, negate dst\n                units === 'week' ? (delta - zoneDelta) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst\n                delta;\n        }\n        return asFloat ? output : absFloor(output);\n    }\n\n    function monthDiff (a, b) {\n        // difference in months\n        var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),\n            // b is in (anchor - 1 month, anchor + 1 month)\n            anchor = a.clone().add(wholeMonthDiff, 'months'),\n            anchor2, adjust;\n\n        if (b - anchor < 0) {\n            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n            // linear across the month\n            adjust = (b - anchor) / (anchor - anchor2);\n        } else {\n            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n            // linear across the month\n            adjust = (b - anchor) / (anchor2 - anchor);\n        }\n\n        //check for negative zero, return zero if negative zero\n        return -(wholeMonthDiff + adjust) || 0;\n    }\n\n    utils_hooks__hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n    utils_hooks__hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\n    function toString () {\n        return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n    }\n\n    function moment_format__toISOString () {\n        var m = this.clone().utc();\n        if (0 < m.year() && m.year() <= 9999) {\n            if (isFunction(Date.prototype.toISOString)) {\n                // native implementation is ~50x faster, use it when we can\n                return this.toDate().toISOString();\n            } else {\n                return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n            }\n        } else {\n            return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n        }\n    }\n\n    function format (inputString) {\n        if (!inputString) {\n            inputString = this.isUtc() ? utils_hooks__hooks.defaultFormatUtc : utils_hooks__hooks.defaultFormat;\n        }\n        var output = formatMoment(this, inputString);\n        return this.localeData().postformat(output);\n    }\n\n    function from (time, withoutSuffix) {\n        if (this.isValid() &&\n                ((isMoment(time) && time.isValid()) ||\n                 local__createLocal(time).isValid())) {\n            return create__createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);\n        } else {\n            return this.localeData().invalidDate();\n        }\n    }\n\n    function fromNow (withoutSuffix) {\n        return this.from(local__createLocal(), withoutSuffix);\n    }\n\n    function to (time, withoutSuffix) {\n        if (this.isValid() &&\n                ((isMoment(time) && time.isValid()) ||\n                 local__createLocal(time).isValid())) {\n            return create__createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);\n        } else {\n            return this.localeData().invalidDate();\n        }\n    }\n\n    function toNow (withoutSuffix) {\n        return this.to(local__createLocal(), withoutSuffix);\n    }\n\n    // If passed a locale key, it will set the locale for this\n    // instance.  Otherwise, it will return the locale configuration\n    // variables for this instance.\n    function locale (key) {\n        var newLocaleData;\n\n        if (key === undefined) {\n            return this._locale._abbr;\n        } else {\n            newLocaleData = locale_locales__getLocale(key);\n            if (newLocaleData != null) {\n                this._locale = newLocaleData;\n            }\n            return this;\n        }\n    }\n\n    var lang = deprecate(\n        'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n        function (key) {\n            if (key === undefined) {\n                return this.localeData();\n            } else {\n                return this.locale(key);\n            }\n        }\n    );\n\n    function localeData () {\n        return this._locale;\n    }\n\n    function startOf (units) {\n        units = normalizeUnits(units);\n        // the following switch intentionally omits break keywords\n        // to utilize falling through the cases.\n        switch (units) {\n            case 'year':\n                this.month(0);\n                /* falls through */\n            case 'quarter':\n            case 'month':\n                this.date(1);\n                /* falls through */\n            case 'week':\n            case 'isoWeek':\n            case 'day':\n            case 'date':\n                this.hours(0);\n                /* falls through */\n            case 'hour':\n                this.minutes(0);\n                /* falls through */\n            case 'minute':\n                this.seconds(0);\n                /* falls through */\n            case 'second':\n                this.milliseconds(0);\n        }\n\n        // weeks are a special case\n        if (units === 'week') {\n            this.weekday(0);\n        }\n        if (units === 'isoWeek') {\n            this.isoWeekday(1);\n        }\n\n        // quarters are also special\n        if (units === 'quarter') {\n            this.month(Math.floor(this.month() / 3) * 3);\n        }\n\n        return this;\n    }\n\n    function endOf (units) {\n        units = normalizeUnits(units);\n        if (units === undefined || units === 'millisecond') {\n            return this;\n        }\n\n        // 'date' is an alias for 'day', so it should be considered as such.\n        if (units === 'date') {\n            units = 'day';\n        }\n\n        return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');\n    }\n\n    function to_type__valueOf () {\n        return this._d.valueOf() - ((this._offset || 0) * 60000);\n    }\n\n    function unix () {\n        return Math.floor(this.valueOf() / 1000);\n    }\n\n    function toDate () {\n        return new Date(this.valueOf());\n    }\n\n    function toArray () {\n        var m = this;\n        return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n    }\n\n    function toObject () {\n        var m = this;\n        return {\n            years: m.year(),\n            months: m.month(),\n            date: m.date(),\n            hours: m.hours(),\n            minutes: m.minutes(),\n            seconds: m.seconds(),\n            milliseconds: m.milliseconds()\n        };\n    }\n\n    function toJSON () {\n        // new Date(NaN).toJSON() === null\n        return this.isValid() ? this.toISOString() : null;\n    }\n\n    function moment_valid__isValid () {\n        return valid__isValid(this);\n    }\n\n    function parsingFlags () {\n        return extend({}, getParsingFlags(this));\n    }\n\n    function invalidAt () {\n        return getParsingFlags(this).overflow;\n    }\n\n    function creationData() {\n        return {\n            input: this._i,\n            format: this._f,\n            locale: this._locale,\n            isUTC: this._isUTC,\n            strict: this._strict\n        };\n    }\n\n    // FORMATTING\n\n    addFormatToken(0, ['gg', 2], 0, function () {\n        return this.weekYear() % 100;\n    });\n\n    addFormatToken(0, ['GG', 2], 0, function () {\n        return this.isoWeekYear() % 100;\n    });\n\n    function addWeekYearFormatToken (token, getter) {\n        addFormatToken(0, [token, token.length], 0, getter);\n    }\n\n    addWeekYearFormatToken('gggg',     'weekYear');\n    addWeekYearFormatToken('ggggg',    'weekYear');\n    addWeekYearFormatToken('GGGG',  'isoWeekYear');\n    addWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n    // ALIASES\n\n    addUnitAlias('weekYear', 'gg');\n    addUnitAlias('isoWeekYear', 'GG');\n\n    // PRIORITY\n\n    addUnitPriority('weekYear', 1);\n    addUnitPriority('isoWeekYear', 1);\n\n\n    // PARSING\n\n    addRegexToken('G',      matchSigned);\n    addRegexToken('g',      matchSigned);\n    addRegexToken('GG',     match1to2, match2);\n    addRegexToken('gg',     match1to2, match2);\n    addRegexToken('GGGG',   match1to4, match4);\n    addRegexToken('gggg',   match1to4, match4);\n    addRegexToken('GGGGG',  match1to6, match6);\n    addRegexToken('ggggg',  match1to6, match6);\n\n    addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n        week[token.substr(0, 2)] = toInt(input);\n    });\n\n    addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n        week[token] = utils_hooks__hooks.parseTwoDigitYear(input);\n    });\n\n    // MOMENTS\n\n    function getSetWeekYear (input) {\n        return getSetWeekYearHelper.call(this,\n                input,\n                this.week(),\n                this.weekday(),\n                this.localeData()._week.dow,\n                this.localeData()._week.doy);\n    }\n\n    function getSetISOWeekYear (input) {\n        return getSetWeekYearHelper.call(this,\n                input, this.isoWeek(), this.isoWeekday(), 1, 4);\n    }\n\n    function getISOWeeksInYear () {\n        return weeksInYear(this.year(), 1, 4);\n    }\n\n    function getWeeksInYear () {\n        var weekInfo = this.localeData()._week;\n        return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n    }\n\n    function getSetWeekYearHelper(input, week, weekday, dow, doy) {\n        var weeksTarget;\n        if (input == null) {\n            return weekOfYear(this, dow, doy).year;\n        } else {\n            weeksTarget = weeksInYear(input, dow, doy);\n            if (week > weeksTarget) {\n                week = weeksTarget;\n            }\n            return setWeekAll.call(this, input, week, weekday, dow, doy);\n        }\n    }\n\n    function setWeekAll(weekYear, week, weekday, dow, doy) {\n        var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n            date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n        this.year(date.getUTCFullYear());\n        this.month(date.getUTCMonth());\n        this.date(date.getUTCDate());\n        return this;\n    }\n\n    // FORMATTING\n\n    addFormatToken('Q', 0, 'Qo', 'quarter');\n\n    // ALIASES\n\n    addUnitAlias('quarter', 'Q');\n\n    // PRIORITY\n\n    addUnitPriority('quarter', 7);\n\n    // PARSING\n\n    addRegexToken('Q', match1);\n    addParseToken('Q', function (input, array) {\n        array[MONTH] = (toInt(input) - 1) * 3;\n    });\n\n    // MOMENTS\n\n    function getSetQuarter (input) {\n        return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n    }\n\n    // FORMATTING\n\n    addFormatToken('D', ['DD', 2], 'Do', 'date');\n\n    // ALIASES\n\n    addUnitAlias('date', 'D');\n\n    // PRIOROITY\n    addUnitPriority('date', 9);\n\n    // PARSING\n\n    addRegexToken('D',  match1to2);\n    addRegexToken('DD', match1to2, match2);\n    addRegexToken('Do', function (isStrict, locale) {\n        return isStrict ? locale._ordinalParse : locale._ordinalParseLenient;\n    });\n\n    addParseToken(['D', 'DD'], DATE);\n    addParseToken('Do', function (input, array) {\n        array[DATE] = toInt(input.match(match1to2)[0], 10);\n    });\n\n    // MOMENTS\n\n    var getSetDayOfMonth = makeGetSet('Date', true);\n\n    // FORMATTING\n\n    addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n    // ALIASES\n\n    addUnitAlias('dayOfYear', 'DDD');\n\n    // PRIORITY\n    addUnitPriority('dayOfYear', 4);\n\n    // PARSING\n\n    addRegexToken('DDD',  match1to3);\n    addRegexToken('DDDD', match3);\n    addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n        config._dayOfYear = toInt(input);\n    });\n\n    // HELPERS\n\n    // MOMENTS\n\n    function getSetDayOfYear (input) {\n        var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n        return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');\n    }\n\n    // FORMATTING\n\n    addFormatToken('m', ['mm', 2], 0, 'minute');\n\n    // ALIASES\n\n    addUnitAlias('minute', 'm');\n\n    // PRIORITY\n\n    addUnitPriority('minute', 14);\n\n    // PARSING\n\n    addRegexToken('m',  match1to2);\n    addRegexToken('mm', match1to2, match2);\n    addParseToken(['m', 'mm'], MINUTE);\n\n    // MOMENTS\n\n    var getSetMinute = makeGetSet('Minutes', false);\n\n    // FORMATTING\n\n    addFormatToken('s', ['ss', 2], 0, 'second');\n\n    // ALIASES\n\n    addUnitAlias('second', 's');\n\n    // PRIORITY\n\n    addUnitPriority('second', 15);\n\n    // PARSING\n\n    addRegexToken('s',  match1to2);\n    addRegexToken('ss', match1to2, match2);\n    addParseToken(['s', 'ss'], SECOND);\n\n    // MOMENTS\n\n    var getSetSecond = makeGetSet('Seconds', false);\n\n    // FORMATTING\n\n    addFormatToken('S', 0, 0, function () {\n        return ~~(this.millisecond() / 100);\n    });\n\n    addFormatToken(0, ['SS', 2], 0, function () {\n        return ~~(this.millisecond() / 10);\n    });\n\n    addFormatToken(0, ['SSS', 3], 0, 'millisecond');\n    addFormatToken(0, ['SSSS', 4], 0, function () {\n        return this.millisecond() * 10;\n    });\n    addFormatToken(0, ['SSSSS', 5], 0, function () {\n        return this.millisecond() * 100;\n    });\n    addFormatToken(0, ['SSSSSS', 6], 0, function () {\n        return this.millisecond() * 1000;\n    });\n    addFormatToken(0, ['SSSSSSS', 7], 0, function () {\n        return this.millisecond() * 10000;\n    });\n    addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n        return this.millisecond() * 100000;\n    });\n    addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n        return this.millisecond() * 1000000;\n    });\n\n\n    // ALIASES\n\n    addUnitAlias('millisecond', 'ms');\n\n    // PRIORITY\n\n    addUnitPriority('millisecond', 16);\n\n    // PARSING\n\n    addRegexToken('S',    match1to3, match1);\n    addRegexToken('SS',   match1to3, match2);\n    addRegexToken('SSS',  match1to3, match3);\n\n    var token;\n    for (token = 'SSSS'; token.length <= 9; token += 'S') {\n        addRegexToken(token, matchUnsigned);\n    }\n\n    function parseMs(input, array) {\n        array[MILLISECOND] = toInt(('0.' + input) * 1000);\n    }\n\n    for (token = 'S'; token.length <= 9; token += 'S') {\n        addParseToken(token, parseMs);\n    }\n    // MOMENTS\n\n    var getSetMillisecond = makeGetSet('Milliseconds', false);\n\n    // FORMATTING\n\n    addFormatToken('z',  0, 0, 'zoneAbbr');\n    addFormatToken('zz', 0, 0, 'zoneName');\n\n    // MOMENTS\n\n    function getZoneAbbr () {\n        return this._isUTC ? 'UTC' : '';\n    }\n\n    function getZoneName () {\n        return this._isUTC ? 'Coordinated Universal Time' : '';\n    }\n\n    var momentPrototype__proto = Moment.prototype;\n\n    momentPrototype__proto.add               = add_subtract__add;\n    momentPrototype__proto.calendar          = moment_calendar__calendar;\n    momentPrototype__proto.clone             = clone;\n    momentPrototype__proto.diff              = diff;\n    momentPrototype__proto.endOf             = endOf;\n    momentPrototype__proto.format            = format;\n    momentPrototype__proto.from              = from;\n    momentPrototype__proto.fromNow           = fromNow;\n    momentPrototype__proto.to                = to;\n    momentPrototype__proto.toNow             = toNow;\n    momentPrototype__proto.get               = stringGet;\n    momentPrototype__proto.invalidAt         = invalidAt;\n    momentPrototype__proto.isAfter           = isAfter;\n    momentPrototype__proto.isBefore          = isBefore;\n    momentPrototype__proto.isBetween         = isBetween;\n    momentPrototype__proto.isSame            = isSame;\n    momentPrototype__proto.isSameOrAfter     = isSameOrAfter;\n    momentPrototype__proto.isSameOrBefore    = isSameOrBefore;\n    momentPrototype__proto.isValid           = moment_valid__isValid;\n    momentPrototype__proto.lang              = lang;\n    momentPrototype__proto.locale            = locale;\n    momentPrototype__proto.localeData        = localeData;\n    momentPrototype__proto.max               = prototypeMax;\n    momentPrototype__proto.min               = prototypeMin;\n    momentPrototype__proto.parsingFlags      = parsingFlags;\n    momentPrototype__proto.set               = stringSet;\n    momentPrototype__proto.startOf           = startOf;\n    momentPrototype__proto.subtract          = add_subtract__subtract;\n    momentPrototype__proto.toArray           = toArray;\n    momentPrototype__proto.toObject          = toObject;\n    momentPrototype__proto.toDate            = toDate;\n    momentPrototype__proto.toISOString       = moment_format__toISOString;\n    momentPrototype__proto.toJSON            = toJSON;\n    momentPrototype__proto.toString          = toString;\n    momentPrototype__proto.unix              = unix;\n    momentPrototype__proto.valueOf           = to_type__valueOf;\n    momentPrototype__proto.creationData      = creationData;\n\n    // Year\n    momentPrototype__proto.year       = getSetYear;\n    momentPrototype__proto.isLeapYear = getIsLeapYear;\n\n    // Week Year\n    momentPrototype__proto.weekYear    = getSetWeekYear;\n    momentPrototype__proto.isoWeekYear = getSetISOWeekYear;\n\n    // Quarter\n    momentPrototype__proto.quarter = momentPrototype__proto.quarters = getSetQuarter;\n\n    // Month\n    momentPrototype__proto.month       = getSetMonth;\n    momentPrototype__proto.daysInMonth = getDaysInMonth;\n\n    // Week\n    momentPrototype__proto.week           = momentPrototype__proto.weeks        = getSetWeek;\n    momentPrototype__proto.isoWeek        = momentPrototype__proto.isoWeeks     = getSetISOWeek;\n    momentPrototype__proto.weeksInYear    = getWeeksInYear;\n    momentPrototype__proto.isoWeeksInYear = getISOWeeksInYear;\n\n    // Day\n    momentPrototype__proto.date       = getSetDayOfMonth;\n    momentPrototype__proto.day        = momentPrototype__proto.days             = getSetDayOfWeek;\n    momentPrototype__proto.weekday    = getSetLocaleDayOfWeek;\n    momentPrototype__proto.isoWeekday = getSetISODayOfWeek;\n    momentPrototype__proto.dayOfYear  = getSetDayOfYear;\n\n    // Hour\n    momentPrototype__proto.hour = momentPrototype__proto.hours = getSetHour;\n\n    // Minute\n    momentPrototype__proto.minute = momentPrototype__proto.minutes = getSetMinute;\n\n    // Second\n    momentPrototype__proto.second = momentPrototype__proto.seconds = getSetSecond;\n\n    // Millisecond\n    momentPrototype__proto.millisecond = momentPrototype__proto.milliseconds = getSetMillisecond;\n\n    // Offset\n    momentPrototype__proto.utcOffset            = getSetOffset;\n    momentPrototype__proto.utc                  = setOffsetToUTC;\n    momentPrototype__proto.local                = setOffsetToLocal;\n    momentPrototype__proto.parseZone            = setOffsetToParsedOffset;\n    momentPrototype__proto.hasAlignedHourOffset = hasAlignedHourOffset;\n    momentPrototype__proto.isDST                = isDaylightSavingTime;\n    momentPrototype__proto.isLocal              = isLocal;\n    momentPrototype__proto.isUtcOffset          = isUtcOffset;\n    momentPrototype__proto.isUtc                = isUtc;\n    momentPrototype__proto.isUTC                = isUtc;\n\n    // Timezone\n    momentPrototype__proto.zoneAbbr = getZoneAbbr;\n    momentPrototype__proto.zoneName = getZoneName;\n\n    // Deprecations\n    momentPrototype__proto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\n    momentPrototype__proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\n    momentPrototype__proto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);\n    momentPrototype__proto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\n    momentPrototype__proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n\n    var momentPrototype = momentPrototype__proto;\n\n    function moment__createUnix (input) {\n        return local__createLocal(input * 1000);\n    }\n\n    function moment__createInZone () {\n        return local__createLocal.apply(null, arguments).parseZone();\n    }\n\n    function preParsePostFormat (string) {\n        return string;\n    }\n\n    var prototype__proto = Locale.prototype;\n\n    prototype__proto.calendar        = locale_calendar__calendar;\n    prototype__proto.longDateFormat  = longDateFormat;\n    prototype__proto.invalidDate     = invalidDate;\n    prototype__proto.ordinal         = ordinal;\n    prototype__proto.preparse        = preParsePostFormat;\n    prototype__proto.postformat      = preParsePostFormat;\n    prototype__proto.relativeTime    = relative__relativeTime;\n    prototype__proto.pastFuture      = pastFuture;\n    prototype__proto.set             = locale_set__set;\n\n    // Month\n    prototype__proto.months            =        localeMonths;\n    prototype__proto.monthsShort       =        localeMonthsShort;\n    prototype__proto.monthsParse       =        localeMonthsParse;\n    prototype__proto.monthsRegex       = monthsRegex;\n    prototype__proto.monthsShortRegex  = monthsShortRegex;\n\n    // Week\n    prototype__proto.week = localeWeek;\n    prototype__proto.firstDayOfYear = localeFirstDayOfYear;\n    prototype__proto.firstDayOfWeek = localeFirstDayOfWeek;\n\n    // Day of Week\n    prototype__proto.weekdays       =        localeWeekdays;\n    prototype__proto.weekdaysMin    =        localeWeekdaysMin;\n    prototype__proto.weekdaysShort  =        localeWeekdaysShort;\n    prototype__proto.weekdaysParse  =        localeWeekdaysParse;\n\n    prototype__proto.weekdaysRegex       =        weekdaysRegex;\n    prototype__proto.weekdaysShortRegex  =        weekdaysShortRegex;\n    prototype__proto.weekdaysMinRegex    =        weekdaysMinRegex;\n\n    // Hours\n    prototype__proto.isPM = localeIsPM;\n    prototype__proto.meridiem = localeMeridiem;\n\n    function lists__get (format, index, field, setter) {\n        var locale = locale_locales__getLocale();\n        var utc = create_utc__createUTC().set(setter, index);\n        return locale[field](utc, format);\n    }\n\n    function listMonthsImpl (format, index, field) {\n        if (typeof format === 'number') {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n\n        if (index != null) {\n            return lists__get(format, index, field, 'month');\n        }\n\n        var i;\n        var out = [];\n        for (i = 0; i < 12; i++) {\n            out[i] = lists__get(format, i, field, 'month');\n        }\n        return out;\n    }\n\n    // ()\n    // (5)\n    // (fmt, 5)\n    // (fmt)\n    // (true)\n    // (true, 5)\n    // (true, fmt, 5)\n    // (true, fmt)\n    function listWeekdaysImpl (localeSorted, format, index, field) {\n        if (typeof localeSorted === 'boolean') {\n            if (typeof format === 'number') {\n                index = format;\n                format = undefined;\n            }\n\n            format = format || '';\n        } else {\n            format = localeSorted;\n            index = format;\n            localeSorted = false;\n\n            if (typeof format === 'number') {\n                index = format;\n                format = undefined;\n            }\n\n            format = format || '';\n        }\n\n        var locale = locale_locales__getLocale(),\n            shift = localeSorted ? locale._week.dow : 0;\n\n        if (index != null) {\n            return lists__get(format, (index + shift) % 7, field, 'day');\n        }\n\n        var i;\n        var out = [];\n        for (i = 0; i < 7; i++) {\n            out[i] = lists__get(format, (i + shift) % 7, field, 'day');\n        }\n        return out;\n    }\n\n    function lists__listMonths (format, index) {\n        return listMonthsImpl(format, index, 'months');\n    }\n\n    function lists__listMonthsShort (format, index) {\n        return listMonthsImpl(format, index, 'monthsShort');\n    }\n\n    function lists__listWeekdays (localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n    }\n\n    function lists__listWeekdaysShort (localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n    }\n\n    function lists__listWeekdaysMin (localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n    }\n\n    locale_locales__getSetGlobalLocale('en', {\n        ordinalParse: /\\d{1,2}(th|st|nd|rd)/,\n        ordinal : function (number) {\n            var b = number % 10,\n                output = (toInt(number % 100 / 10) === 1) ? 'th' :\n                (b === 1) ? 'st' :\n                (b === 2) ? 'nd' :\n                (b === 3) ? 'rd' : 'th';\n            return number + output;\n        }\n    });\n\n    // Side effect imports\n    utils_hooks__hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', locale_locales__getSetGlobalLocale);\n    utils_hooks__hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', locale_locales__getLocale);\n\n    var mathAbs = Math.abs;\n\n    function duration_abs__abs () {\n        var data           = this._data;\n\n        this._milliseconds = mathAbs(this._milliseconds);\n        this._days         = mathAbs(this._days);\n        this._months       = mathAbs(this._months);\n\n        data.milliseconds  = mathAbs(data.milliseconds);\n        data.seconds       = mathAbs(data.seconds);\n        data.minutes       = mathAbs(data.minutes);\n        data.hours         = mathAbs(data.hours);\n        data.months        = mathAbs(data.months);\n        data.years         = mathAbs(data.years);\n\n        return this;\n    }\n\n    function duration_add_subtract__addSubtract (duration, input, value, direction) {\n        var other = create__createDuration(input, value);\n\n        duration._milliseconds += direction * other._milliseconds;\n        duration._days         += direction * other._days;\n        duration._months       += direction * other._months;\n\n        return duration._bubble();\n    }\n\n    // supports only 2.0-style add(1, 's') or add(duration)\n    function duration_add_subtract__add (input, value) {\n        return duration_add_subtract__addSubtract(this, input, value, 1);\n    }\n\n    // supports only 2.0-style subtract(1, 's') or subtract(duration)\n    function duration_add_subtract__subtract (input, value) {\n        return duration_add_subtract__addSubtract(this, input, value, -1);\n    }\n\n    function absCeil (number) {\n        if (number < 0) {\n            return Math.floor(number);\n        } else {\n            return Math.ceil(number);\n        }\n    }\n\n    function bubble () {\n        var milliseconds = this._milliseconds;\n        var days         = this._days;\n        var months       = this._months;\n        var data         = this._data;\n        var seconds, minutes, hours, years, monthsFromDays;\n\n        // if we have a mix of positive and negative values, bubble down first\n        // check: https://github.com/moment/moment/issues/2166\n        if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||\n                (milliseconds <= 0 && days <= 0 && months <= 0))) {\n            milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n            days = 0;\n            months = 0;\n        }\n\n        // The following code bubbles up values, see the tests for\n        // examples of what that means.\n        data.milliseconds = milliseconds % 1000;\n\n        seconds           = absFloor(milliseconds / 1000);\n        data.seconds      = seconds % 60;\n\n        minutes           = absFloor(seconds / 60);\n        data.minutes      = minutes % 60;\n\n        hours             = absFloor(minutes / 60);\n        data.hours        = hours % 24;\n\n        days += absFloor(hours / 24);\n\n        // convert days to months\n        monthsFromDays = absFloor(daysToMonths(days));\n        months += monthsFromDays;\n        days -= absCeil(monthsToDays(monthsFromDays));\n\n        // 12 months -> 1 year\n        years = absFloor(months / 12);\n        months %= 12;\n\n        data.days   = days;\n        data.months = months;\n        data.years  = years;\n\n        return this;\n    }\n\n    function daysToMonths (days) {\n        // 400 years have 146097 days (taking into account leap year rules)\n        // 400 years have 12 months === 4800\n        return days * 4800 / 146097;\n    }\n\n    function monthsToDays (months) {\n        // the reverse of daysToMonths\n        return months * 146097 / 4800;\n    }\n\n    function as (units) {\n        var days;\n        var months;\n        var milliseconds = this._milliseconds;\n\n        units = normalizeUnits(units);\n\n        if (units === 'month' || units === 'year') {\n            days   = this._days   + milliseconds / 864e5;\n            months = this._months + daysToMonths(days);\n            return units === 'month' ? months : months / 12;\n        } else {\n            // handle milliseconds separately because of floating point math errors (issue #1867)\n            days = this._days + Math.round(monthsToDays(this._months));\n            switch (units) {\n                case 'week'   : return days / 7     + milliseconds / 6048e5;\n                case 'day'    : return days         + milliseconds / 864e5;\n                case 'hour'   : return days * 24    + milliseconds / 36e5;\n                case 'minute' : return days * 1440  + milliseconds / 6e4;\n                case 'second' : return days * 86400 + milliseconds / 1000;\n                // Math.floor prevents floating point math errors here\n                case 'millisecond': return Math.floor(days * 864e5) + milliseconds;\n                default: throw new Error('Unknown unit ' + units);\n            }\n        }\n    }\n\n    // TODO: Use this.as('ms')?\n    function duration_as__valueOf () {\n        return (\n            this._milliseconds +\n            this._days * 864e5 +\n            (this._months % 12) * 2592e6 +\n            toInt(this._months / 12) * 31536e6\n        );\n    }\n\n    function makeAs (alias) {\n        return function () {\n            return this.as(alias);\n        };\n    }\n\n    var asMilliseconds = makeAs('ms');\n    var asSeconds      = makeAs('s');\n    var asMinutes      = makeAs('m');\n    var asHours        = makeAs('h');\n    var asDays         = makeAs('d');\n    var asWeeks        = makeAs('w');\n    var asMonths       = makeAs('M');\n    var asYears        = makeAs('y');\n\n    function duration_get__get (units) {\n        units = normalizeUnits(units);\n        return this[units + 's']();\n    }\n\n    function makeGetter(name) {\n        return function () {\n            return this._data[name];\n        };\n    }\n\n    var milliseconds = makeGetter('milliseconds');\n    var seconds      = makeGetter('seconds');\n    var minutes      = makeGetter('minutes');\n    var hours        = makeGetter('hours');\n    var days         = makeGetter('days');\n    var months       = makeGetter('months');\n    var years        = makeGetter('years');\n\n    function weeks () {\n        return absFloor(this.days() / 7);\n    }\n\n    var round = Math.round;\n    var thresholds = {\n        s: 45,  // seconds to minute\n        m: 45,  // minutes to hour\n        h: 22,  // hours to day\n        d: 26,  // days to month\n        M: 11   // months to year\n    };\n\n    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n    }\n\n    function duration_humanize__relativeTime (posNegDuration, withoutSuffix, locale) {\n        var duration = create__createDuration(posNegDuration).abs();\n        var seconds  = round(duration.as('s'));\n        var minutes  = round(duration.as('m'));\n        var hours    = round(duration.as('h'));\n        var days     = round(duration.as('d'));\n        var months   = round(duration.as('M'));\n        var years    = round(duration.as('y'));\n\n        var a = seconds < thresholds.s && ['s', seconds]  ||\n                minutes <= 1           && ['m']           ||\n                minutes < thresholds.m && ['mm', minutes] ||\n                hours   <= 1           && ['h']           ||\n                hours   < thresholds.h && ['hh', hours]   ||\n                days    <= 1           && ['d']           ||\n                days    < thresholds.d && ['dd', days]    ||\n                months  <= 1           && ['M']           ||\n                months  < thresholds.M && ['MM', months]  ||\n                years   <= 1           && ['y']           || ['yy', years];\n\n        a[2] = withoutSuffix;\n        a[3] = +posNegDuration > 0;\n        a[4] = locale;\n        return substituteTimeAgo.apply(null, a);\n    }\n\n    // This function allows you to set the rounding function for relative time strings\n    function duration_humanize__getSetRelativeTimeRounding (roundingFunction) {\n        if (roundingFunction === undefined) {\n            return round;\n        }\n        if (typeof(roundingFunction) === 'function') {\n            round = roundingFunction;\n            return true;\n        }\n        return false;\n    }\n\n    // This function allows you to set a threshold for relative time strings\n    function duration_humanize__getSetRelativeTimeThreshold (threshold, limit) {\n        if (thresholds[threshold] === undefined) {\n            return false;\n        }\n        if (limit === undefined) {\n            return thresholds[threshold];\n        }\n        thresholds[threshold] = limit;\n        return true;\n    }\n\n    function humanize (withSuffix) {\n        var locale = this.localeData();\n        var output = duration_humanize__relativeTime(this, !withSuffix, locale);\n\n        if (withSuffix) {\n            output = locale.pastFuture(+this, output);\n        }\n\n        return locale.postformat(output);\n    }\n\n    var iso_string__abs = Math.abs;\n\n    function iso_string__toISOString() {\n        // for ISO strings we do not use the normal bubbling rules:\n        //  * milliseconds bubble up until they become hours\n        //  * days do not bubble at all\n        //  * months bubble up until they become years\n        // This is because there is no context-free conversion between hours and days\n        // (think of clock changes)\n        // and also not between days and months (28-31 days per month)\n        var seconds = iso_string__abs(this._milliseconds) / 1000;\n        var days         = iso_string__abs(this._days);\n        var months       = iso_string__abs(this._months);\n        var minutes, hours, years;\n\n        // 3600 seconds -> 60 minutes -> 1 hour\n        minutes           = absFloor(seconds / 60);\n        hours             = absFloor(minutes / 60);\n        seconds %= 60;\n        minutes %= 60;\n\n        // 12 months -> 1 year\n        years  = absFloor(months / 12);\n        months %= 12;\n\n\n        // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n        var Y = years;\n        var M = months;\n        var D = days;\n        var h = hours;\n        var m = minutes;\n        var s = seconds;\n        var total = this.asSeconds();\n\n        if (!total) {\n            // this is the same as C#'s (Noda) and python (isodate)...\n            // but not other JS (goog.date)\n            return 'P0D';\n        }\n\n        return (total < 0 ? '-' : '') +\n            'P' +\n            (Y ? Y + 'Y' : '') +\n            (M ? M + 'M' : '') +\n            (D ? D + 'D' : '') +\n            ((h || m || s) ? 'T' : '') +\n            (h ? h + 'H' : '') +\n            (m ? m + 'M' : '') +\n            (s ? s + 'S' : '');\n    }\n\n    var duration_prototype__proto = Duration.prototype;\n\n    duration_prototype__proto.abs            = duration_abs__abs;\n    duration_prototype__proto.add            = duration_add_subtract__add;\n    duration_prototype__proto.subtract       = duration_add_subtract__subtract;\n    duration_prototype__proto.as             = as;\n    duration_prototype__proto.asMilliseconds = asMilliseconds;\n    duration_prototype__proto.asSeconds      = asSeconds;\n    duration_prototype__proto.asMinutes      = asMinutes;\n    duration_prototype__proto.asHours        = asHours;\n    duration_prototype__proto.asDays         = asDays;\n    duration_prototype__proto.asWeeks        = asWeeks;\n    duration_prototype__proto.asMonths       = asMonths;\n    duration_prototype__proto.asYears        = asYears;\n    duration_prototype__proto.valueOf        = duration_as__valueOf;\n    duration_prototype__proto._bubble        = bubble;\n    duration_prototype__proto.get            = duration_get__get;\n    duration_prototype__proto.milliseconds   = milliseconds;\n    duration_prototype__proto.seconds        = seconds;\n    duration_prototype__proto.minutes        = minutes;\n    duration_prototype__proto.hours          = hours;\n    duration_prototype__proto.days           = days;\n    duration_prototype__proto.weeks          = weeks;\n    duration_prototype__proto.months         = months;\n    duration_prototype__proto.years          = years;\n    duration_prototype__proto.humanize       = humanize;\n    duration_prototype__proto.toISOString    = iso_string__toISOString;\n    duration_prototype__proto.toString       = iso_string__toISOString;\n    duration_prototype__proto.toJSON         = iso_string__toISOString;\n    duration_prototype__proto.locale         = locale;\n    duration_prototype__proto.localeData     = localeData;\n\n    // Deprecations\n    duration_prototype__proto.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', iso_string__toISOString);\n    duration_prototype__proto.lang = lang;\n\n    // Side effect imports\n\n    // FORMATTING\n\n    addFormatToken('X', 0, 0, 'unix');\n    addFormatToken('x', 0, 0, 'valueOf');\n\n    // PARSING\n\n    addRegexToken('x', matchSigned);\n    addRegexToken('X', matchTimestamp);\n    addParseToken('X', function (input, array, config) {\n        config._d = new Date(parseFloat(input, 10) * 1000);\n    });\n    addParseToken('x', function (input, array, config) {\n        config._d = new Date(toInt(input));\n    });\n\n    // Side effect imports\n\n\n    utils_hooks__hooks.version = '2.15.1';\n\n    setHookCallback(local__createLocal);\n\n    utils_hooks__hooks.fn                    = momentPrototype;\n    utils_hooks__hooks.min                   = min;\n    utils_hooks__hooks.max                   = max;\n    utils_hooks__hooks.now                   = now;\n    utils_hooks__hooks.utc                   = create_utc__createUTC;\n    utils_hooks__hooks.unix                  = moment__createUnix;\n    utils_hooks__hooks.months                = lists__listMonths;\n    utils_hooks__hooks.isDate                = isDate;\n    utils_hooks__hooks.locale                = locale_locales__getSetGlobalLocale;\n    utils_hooks__hooks.invalid               = valid__createInvalid;\n    utils_hooks__hooks.duration              = create__createDuration;\n    utils_hooks__hooks.isMoment              = isMoment;\n    utils_hooks__hooks.weekdays              = lists__listWeekdays;\n    utils_hooks__hooks.parseZone             = moment__createInZone;\n    utils_hooks__hooks.localeData            = locale_locales__getLocale;\n    utils_hooks__hooks.isDuration            = isDuration;\n    utils_hooks__hooks.monthsShort           = lists__listMonthsShort;\n    utils_hooks__hooks.weekdaysMin           = lists__listWeekdaysMin;\n    utils_hooks__hooks.defineLocale          = defineLocale;\n    utils_hooks__hooks.updateLocale          = updateLocale;\n    utils_hooks__hooks.locales               = locale_locales__listLocales;\n    utils_hooks__hooks.weekdaysShort         = lists__listWeekdaysShort;\n    utils_hooks__hooks.normalizeUnits        = normalizeUnits;\n    utils_hooks__hooks.relativeTimeRounding = duration_humanize__getSetRelativeTimeRounding;\n    utils_hooks__hooks.relativeTimeThreshold = duration_humanize__getSetRelativeTimeThreshold;\n    utils_hooks__hooks.calendarFormat        = getCalendarFormat;\n    utils_hooks__hooks.prototype             = momentPrototype;\n\n    var _moment = utils_hooks__hooks;\n\n    return _moment;\n\n}));"
  },
  {
    "path": "src/main/resources/static/assets/js/theme.js",
    "content": "var saveSelectColor = {\n    'Name': 'SelcetColor',\n    'Color': 'theme-white'\n}\n\nfunction getThemeToggle() {\n// 判断用户是否已有自己选择的模板风格\n    if (storageLoad('SelcetColor')) {\n        saveSelectColor = storageLoad('SelcetColor');\n        $('body').attr('class', saveSelectColor.Color)\n        if (saveSelectColor.Color == 'theme-white') {\n            $('#eyesI').attr('class', 'am-icon-toggle-off');\n        } else {\n            $('#eyesI').attr('class', 'am-icon-toggle-on');\n        }\n    } else {\n        storageSave(saveSelectColor);\n        $('body').attr('class', 'theme-white')\n    }\n}\n\n// session缓存\nfunction storageSave(objectData) {\n    sessionStorage.setItem(objectData.Name, JSON.stringify(objectData));\n}\n\nfunction storageLoad(objectName) {\n    if (sessionStorage.getItem(objectName)) {\n        return JSON.parse(sessionStorage.getItem(objectName))\n    } else {\n        return false\n    }\n}"
  },
  {
    "path": "src/main/resources/static/assets/js/todomvc.js",
    "content": "// Full spec-compliant TodoMVC with localStorage persistence\n// and hash-based routing in ~150 lines.\n\n// localStorage persistence\nvar STORAGE_KEY = 'todos-vuejs-2.0'\nvar todoStorage = {\n    fetch: function () {\n        var todos = JSON.parse(localStorage.getItem(STORAGE_KEY) || '[]')\n        todos.forEach(function (todo, index) {\n            todo.id = index\n        })\n        todoStorage.uid = todos.length\n        return todos\n    },\n    save: function (todos) {\n        localStorage.setItem(STORAGE_KEY, JSON.stringify(todos))\n    }\n}\n\n// visibility filters\nvar filters = {\n    all: function (todos) {\n        return todos\n    },\n    active: function (todos) {\n        return todos.filter(function (todo) {\n            return !todo.completed\n        })\n    },\n    completed: function (todos) {\n        return todos.filter(function (todo) {\n            return todo.completed\n        })\n    }\n}\n\n// app Vue instance\nvar app = new Vue({\n    // app initial state\n    data: {\n        todos: todoStorage.fetch(),\n        newTodo: '',\n        editedTodo: null,\n        visibility: 'all'\n    },\n\n    // watch todos change for localStorage persistence\n    watch: {\n        todos: {\n            handler: function (todos) {\n                todoStorage.save(todos)\n            },\n            deep: true\n        }\n    },\n\n    // computed properties\n    // https://vuejs.org/guide/computed.html\n    computed: {\n        filteredTodos: function () {\n            return filters[this.visibility](this.todos)\n        },\n        remaining: function () {\n            return filters.active(this.todos).length\n        },\n        allDone: {\n            get: function () {\n                return this.remaining === 0\n            },\n            set: function (value) {\n                this.todos.forEach(function (todo) {\n                    todo.completed = value\n                })\n            }\n        }\n    },\n\n    filters: {\n        pluralize: function (n) {\n            return n === 1 ? 'item' : 'items'\n        }\n    },\n\n    // methods that implement data logic.\n    // note there's no DOM manipulation here at all.\n    methods: {\n        addTodo: function () {\n            var value = this.newTodo && this.newTodo.trim()\n            if (!value) {\n                return\n            }\n            this.todos.push({\n                id: todoStorage.uid++,\n                title: value,\n                completed: false\n            })\n            this.newTodo = ''\n        },\n\n        removeTodo: function (todo) {\n            this.todos.splice(this.todos.indexOf(todo), 1)\n        },\n\n        editTodo: function (todo) {\n            this.beforeEditCache = todo.title\n            this.editedTodo = todo\n        },\n\n        doneEdit: function (todo) {\n            if (!this.editedTodo) {\n                return\n            }\n            this.editedTodo = null\n            todo.title = todo.title.trim()\n            if (!todo.title) {\n                this.removeTodo(todo)\n            }\n        },\n\n        cancelEdit: function (todo) {\n            this.editedTodo = null\n            todo.title = this.beforeEditCache\n        },\n\n        removeCompleted: function () {\n            this.todos = filters.active(this.todos)\n        }\n    },\n\n    // a custom directive to wait for the DOM to be updated\n    // before focusing on the input field.\n    // https://vuejs.org/guide/custom-directive.html\n    directives: {\n        'todo-focus': function (el, binding) {\n            if (binding.value) {\n                el.focus()\n            }\n        }\n    }\n})\n\n// handle routing\nfunction onHashChange () {\n    var visibility = window.location.hash.replace(/#\\/?/, '')\n    if (filters[visibility]) {\n        app.visibility = visibility\n    } else {\n        window.location.hash = ''\n        app.visibility = 'all'\n    }\n}\n\nwindow.addEventListener('hashchange', onHashChange)\nonHashChange()\n\n// mount\napp.$mount('.todoapp')\n"
  },
  {
    "path": "src/main/resources/static/assets/js/vue.js",
    "content": "/*!\n * Vue.js v2.2.3\n * (c) 2014-2017 Evan You\n * Released under the MIT License.\n */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n      (global.Vue = factory());\n}(this, (function () { 'use strict';\n\n  /*  */\n\n  /**\n   * Convert a value to a string that is actually rendered.\n   */\n  function _toString (val) {\n    return val == null\n      ? ''\n      : typeof val === 'object'\n        ? JSON.stringify(val, null, 2)\n        : String(val)\n  }\n\n  /**\n   * Convert a input value to a number for persistence.\n   * If the conversion fails, return original string.\n   */\n  function toNumber (val) {\n    var n = parseFloat(val);\n    return isNaN(n) ? val : n\n  }\n\n  /**\n   * Make a map and return a function for checking if a key\n   * is in that map.\n   */\n  function makeMap (\n    str,\n    expectsLowerCase\n  ) {\n    var map = Object.create(null);\n    var list = str.split(',');\n    for (var i = 0; i < list.length; i++) {\n      map[list[i]] = true;\n    }\n    return expectsLowerCase\n      ? function (val) { return map[val.toLowerCase()]; }\n      : function (val) { return map[val]; }\n  }\n\n  /**\n   * Check if a tag is a built-in tag.\n   */\n  var isBuiltInTag = makeMap('slot,component', true);\n\n  /**\n   * Remove an item from an array\n   */\n  function remove (arr, item) {\n    if (arr.length) {\n      var index = arr.indexOf(item);\n      if (index > -1) {\n        return arr.splice(index, 1)\n      }\n    }\n  }\n\n  /**\n   * Check whether the object has the property.\n   */\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n  function hasOwn (obj, key) {\n    return hasOwnProperty.call(obj, key)\n  }\n\n  /**\n   * Check if value is primitive\n   */\n  function isPrimitive (value) {\n    return typeof value === 'string' || typeof value === 'number'\n  }\n\n  /**\n   * Create a cached version of a pure function.\n   */\n  function cached (fn) {\n    var cache = Object.create(null);\n    return (function cachedFn (str) {\n      var hit = cache[str];\n      return hit || (cache[str] = fn(str))\n    })\n  }\n\n  /**\n   * Camelize a hyphen-delimited string.\n   */\n  var camelizeRE = /-(\\w)/g;\n  var camelize = cached(function (str) {\n    return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })\n  });\n\n  /**\n   * Capitalize a string.\n   */\n  var capitalize = cached(function (str) {\n    return str.charAt(0).toUpperCase() + str.slice(1)\n  });\n\n  /**\n   * Hyphenate a camelCase string.\n   */\n  var hyphenateRE = /([^-])([A-Z])/g;\n  var hyphenate = cached(function (str) {\n    return str\n      .replace(hyphenateRE, '$1-$2')\n      .replace(hyphenateRE, '$1-$2')\n      .toLowerCase()\n  });\n\n  /**\n   * Simple bind, faster than native\n   */\n  function bind (fn, ctx) {\n    function boundFn (a) {\n      var l = arguments.length;\n      return l\n        ? l > 1\n          ? fn.apply(ctx, arguments)\n          : fn.call(ctx, a)\n        : fn.call(ctx)\n    }\n    // record original fn length\n    boundFn._length = fn.length;\n    return boundFn\n  }\n\n  /**\n   * Convert an Array-like object to a real Array.\n   */\n  function toArray (list, start) {\n    start = start || 0;\n    var i = list.length - start;\n    var ret = new Array(i);\n    while (i--) {\n      ret[i] = list[i + start];\n    }\n    return ret\n  }\n\n  /**\n   * Mix properties into target object.\n   */\n  function extend (to, _from) {\n    for (var key in _from) {\n      to[key] = _from[key];\n    }\n    return to\n  }\n\n  /**\n   * Quick object check - this is primarily used to tell\n   * Objects from primitive values when we know the value\n   * is a JSON-compliant type.\n   */\n  function isObject (obj) {\n    return obj !== null && typeof obj === 'object'\n  }\n\n  /**\n   * Strict object type check. Only returns true\n   * for plain JavaScript objects.\n   */\n  var toString = Object.prototype.toString;\n  var OBJECT_STRING = '[object Object]';\n  function isPlainObject (obj) {\n    return toString.call(obj) === OBJECT_STRING\n  }\n\n  /**\n   * Merge an Array of Objects into a single Object.\n   */\n  function toObject (arr) {\n    var res = {};\n    for (var i = 0; i < arr.length; i++) {\n      if (arr[i]) {\n        extend(res, arr[i]);\n      }\n    }\n    return res\n  }\n\n  /**\n   * Perform no operation.\n   */\n  function noop () {}\n\n  /**\n   * Always return false.\n   */\n  var no = function () { return false; };\n\n  /**\n   * Return same value\n   */\n  var identity = function (_) { return _; };\n\n  /**\n   * Generate a static keys string from compiler modules.\n   */\n  function genStaticKeys (modules) {\n    return modules.reduce(function (keys, m) {\n      return keys.concat(m.staticKeys || [])\n    }, []).join(',')\n  }\n\n  /**\n   * Check if two values are loosely equal - that is,\n   * if they are plain objects, do they have the same shape?\n   */\n  function looseEqual (a, b) {\n    var isObjectA = isObject(a);\n    var isObjectB = isObject(b);\n    if (isObjectA && isObjectB) {\n      try {\n        return JSON.stringify(a) === JSON.stringify(b)\n      } catch (e) {\n        // possible circular reference\n        return a === b\n      }\n    } else if (!isObjectA && !isObjectB) {\n      return String(a) === String(b)\n    } else {\n      return false\n    }\n  }\n\n  function looseIndexOf (arr, val) {\n    for (var i = 0; i < arr.length; i++) {\n      if (looseEqual(arr[i], val)) { return i }\n    }\n    return -1\n  }\n\n  /**\n   * Ensure a function is called only once.\n   */\n  function once (fn) {\n    var called = false;\n    return function () {\n      if (!called) {\n        called = true;\n        fn();\n      }\n    }\n  }\n\n  /*  */\n\n  var config = {\n    /**\n     * Option merge strategies (used in core/util/options)\n     */\n    optionMergeStrategies: Object.create(null),\n\n    /**\n     * Whether to suppress warnings.\n     */\n    silent: false,\n\n    /**\n     * Show production mode tip message on boot?\n     */\n    productionTip: \"development\" !== 'production',\n\n    /**\n     * Whether to enable devtools\n     */\n    devtools: \"development\" !== 'production',\n\n    /**\n     * Whether to record perf\n     */\n    performance: false,\n\n    /**\n     * Error handler for watcher errors\n     */\n    errorHandler: null,\n\n    /**\n     * Ignore certain custom elements\n     */\n    ignoredElements: [],\n\n    /**\n     * Custom user key aliases for v-on\n     */\n    keyCodes: Object.create(null),\n\n    /**\n     * Check if a tag is reserved so that it cannot be registered as a\n     * component. This is platform-dependent and may be overwritten.\n     */\n    isReservedTag: no,\n\n    /**\n     * Check if a tag is an unknown element.\n     * Platform-dependent.\n     */\n    isUnknownElement: no,\n\n    /**\n     * Get the namespace of an element\n     */\n    getTagNamespace: noop,\n\n    /**\n     * Parse the real tag name for the specific platform.\n     */\n    parsePlatformTagName: identity,\n\n    /**\n     * Check if an attribute must be bound using property, e.g. value\n     * Platform-dependent.\n     */\n    mustUseProp: no,\n\n    /**\n     * List of asset types that a component can own.\n     */\n    _assetTypes: [\n      'component',\n      'directive',\n      'filter'\n    ],\n\n    /**\n     * List of lifecycle hooks.\n     */\n    _lifecycleHooks: [\n      'beforeCreate',\n      'created',\n      'beforeMount',\n      'mounted',\n      'beforeUpdate',\n      'updated',\n      'beforeDestroy',\n      'destroyed',\n      'activated',\n      'deactivated'\n    ],\n\n    /**\n     * Max circular updates allowed in a scheduler flush cycle.\n     */\n    _maxUpdateCount: 100\n  };\n\n  /*  */\n\n  var emptyObject = Object.freeze({});\n\n  /**\n   * Check if a string starts with $ or _\n   */\n  function isReserved (str) {\n    var c = (str + '').charCodeAt(0);\n    return c === 0x24 || c === 0x5F\n  }\n\n  /**\n   * Define a property.\n   */\n  function def (obj, key, val, enumerable) {\n    Object.defineProperty(obj, key, {\n      value: val,\n      enumerable: !!enumerable,\n      writable: true,\n      configurable: true\n    });\n  }\n\n  /**\n   * Parse simple path.\n   */\n  var bailRE = /[^\\w.$]/;\n  function parsePath (path) {\n    if (bailRE.test(path)) {\n      return\n    }\n    var segments = path.split('.');\n    return function (obj) {\n      for (var i = 0; i < segments.length; i++) {\n        if (!obj) { return }\n        obj = obj[segments[i]];\n      }\n      return obj\n    }\n  }\n\n  /*  */\n  /* globals MutationObserver */\n\n// can we use __proto__?\n  var hasProto = '__proto__' in {};\n\n// Browser environment sniffing\n  var inBrowser = typeof window !== 'undefined';\n  var UA = inBrowser && window.navigator.userAgent.toLowerCase();\n  var isIE = UA && /msie|trident/.test(UA);\n  var isIE9 = UA && UA.indexOf('msie 9.0') > 0;\n  var isEdge = UA && UA.indexOf('edge/') > 0;\n  var isAndroid = UA && UA.indexOf('android') > 0;\n  var isIOS = UA && /iphone|ipad|ipod|ios/.test(UA);\n  var isChrome = UA && /chrome\\/\\d+/.test(UA) && !isEdge;\n\n// this needs to be lazy-evaled because vue may be required before\n// vue-server-renderer can set VUE_ENV\n  var _isServer;\n  var isServerRendering = function () {\n    if (_isServer === undefined) {\n      /* istanbul ignore if */\n      if (!inBrowser && typeof global !== 'undefined') {\n        // detect presence of vue-server-renderer and avoid\n        // Webpack shimming the process\n        _isServer = global['process'].env.VUE_ENV === 'server';\n      } else {\n        _isServer = false;\n      }\n    }\n    return _isServer\n  };\n\n// detect devtools\n  var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;\n\n  /* istanbul ignore next */\n  function isNative (Ctor) {\n    return /native code/.test(Ctor.toString())\n  }\n\n  var hasSymbol =\n    typeof Symbol !== 'undefined' && isNative(Symbol) &&\n    typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);\n\n  /**\n   * Defer a task to execute it asynchronously.\n   */\n  var nextTick = (function () {\n    var callbacks = [];\n    var pending = false;\n    var timerFunc;\n\n    function nextTickHandler () {\n      pending = false;\n      var copies = callbacks.slice(0);\n      callbacks.length = 0;\n      for (var i = 0; i < copies.length; i++) {\n        copies[i]();\n      }\n    }\n\n    // the nextTick behavior leverages the microtask queue, which can be accessed\n    // via either native Promise.then or MutationObserver.\n    // MutationObserver has wider support, however it is seriously bugged in\n    // UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It\n    // completely stops working after triggering a few times... so, if native\n    // Promise is available, we will use it:\n    /* istanbul ignore if */\n    if (typeof Promise !== 'undefined' && isNative(Promise)) {\n      var p = Promise.resolve();\n      var logError = function (err) { console.error(err); };\n      timerFunc = function () {\n        p.then(nextTickHandler).catch(logError);\n        // in problematic UIWebViews, Promise.then doesn't completely break, but\n        // it can get stuck in a weird state where callbacks are pushed into the\n        // microtask queue but the queue isn't being flushed, until the browser\n        // needs to do some other work, e.g. handle a timer. Therefore we can\n        // \"force\" the microtask queue to be flushed by adding an empty timer.\n        if (isIOS) { setTimeout(noop); }\n      };\n    } else if (typeof MutationObserver !== 'undefined' && (\n        isNative(MutationObserver) ||\n        // PhantomJS and iOS 7.x\n        MutationObserver.toString() === '[object MutationObserverConstructor]'\n      )) {\n      // use MutationObserver where native Promise is not available,\n      // e.g. PhantomJS IE11, iOS7, Android 4.4\n      var counter = 1;\n      var observer = new MutationObserver(nextTickHandler);\n      var textNode = document.createTextNode(String(counter));\n      observer.observe(textNode, {\n        characterData: true\n      });\n      timerFunc = function () {\n        counter = (counter + 1) % 2;\n        textNode.data = String(counter);\n      };\n    } else {\n      // fallback to setTimeout\n      /* istanbul ignore next */\n      timerFunc = function () {\n        setTimeout(nextTickHandler, 0);\n      };\n    }\n\n    return function queueNextTick (cb, ctx) {\n      var _resolve;\n      callbacks.push(function () {\n        if (cb) { cb.call(ctx); }\n        if (_resolve) { _resolve(ctx); }\n      });\n      if (!pending) {\n        pending = true;\n        timerFunc();\n      }\n      if (!cb && typeof Promise !== 'undefined') {\n        return new Promise(function (resolve) {\n          _resolve = resolve;\n        })\n      }\n    }\n  })();\n\n  var _Set;\n  /* istanbul ignore if */\n  if (typeof Set !== 'undefined' && isNative(Set)) {\n    // use native Set when available.\n    _Set = Set;\n  } else {\n    // a non-standard Set polyfill that only works with primitive keys.\n    _Set = (function () {\n      function Set () {\n        this.set = Object.create(null);\n      }\n      Set.prototype.has = function has (key) {\n        return this.set[key] === true\n      };\n      Set.prototype.add = function add (key) {\n        this.set[key] = true;\n      };\n      Set.prototype.clear = function clear () {\n        this.set = Object.create(null);\n      };\n\n      return Set;\n    }());\n  }\n\n  var warn = noop;\n  var tip = noop;\n  var formatComponentName;\n\n  {\n    var hasConsole = typeof console !== 'undefined';\n    var classifyRE = /(?:^|[-_])(\\w)/g;\n    var classify = function (str) { return str\n      .replace(classifyRE, function (c) { return c.toUpperCase(); })\n      .replace(/[-_]/g, ''); };\n\n    warn = function (msg, vm) {\n      if (hasConsole && (!config.silent)) {\n        console.error(\"[Vue warn]: \" + msg + \" \" + (\n            vm ? formatLocation(formatComponentName(vm)) : ''\n          ));\n      }\n    };\n\n    tip = function (msg, vm) {\n      if (hasConsole && (!config.silent)) {\n        console.warn(\"[Vue tip]: \" + msg + \" \" + (\n            vm ? formatLocation(formatComponentName(vm)) : ''\n          ));\n      }\n    };\n\n    formatComponentName = function (vm, includeFile) {\n      if (vm.$root === vm) {\n        return '<Root>'\n      }\n      var name = typeof vm === 'function' && vm.options\n        ? vm.options.name\n        : vm._isVue\n          ? vm.$options.name || vm.$options._componentTag\n          : vm.name;\n\n      var file = vm._isVue && vm.$options.__file;\n      if (!name && file) {\n        var match = file.match(/([^/\\\\]+)\\.vue$/);\n        name = match && match[1];\n      }\n\n      return (\n        (name ? (\"<\" + (classify(name)) + \">\") : \"<Anonymous>\") +\n        (file && includeFile !== false ? (\" at \" + file) : '')\n      )\n    };\n\n    var formatLocation = function (str) {\n      if (str === \"<Anonymous>\") {\n        str += \" - use the \\\"name\\\" option for better debugging messages.\";\n      }\n      return (\"\\n(found in \" + str + \")\")\n    };\n  }\n\n  /*  */\n\n\n  var uid$1 = 0;\n\n  /**\n   * A dep is an observable that can have multiple\n   * directives subscribing to it.\n   */\n  var Dep = function Dep () {\n    this.id = uid$1++;\n    this.subs = [];\n  };\n\n  Dep.prototype.addSub = function addSub (sub) {\n    this.subs.push(sub);\n  };\n\n  Dep.prototype.removeSub = function removeSub (sub) {\n    remove(this.subs, sub);\n  };\n\n  Dep.prototype.depend = function depend () {\n    if (Dep.target) {\n      Dep.target.addDep(this);\n    }\n  };\n\n  Dep.prototype.notify = function notify () {\n    // stabilize the subscriber list first\n    var subs = this.subs.slice();\n    for (var i = 0, l = subs.length; i < l; i++) {\n      subs[i].update();\n    }\n  };\n\n// the current target watcher being evaluated.\n// this is globally unique because there could be only one\n// watcher being evaluated at any time.\n  Dep.target = null;\n  var targetStack = [];\n\n  function pushTarget (_target) {\n    if (Dep.target) { targetStack.push(Dep.target); }\n    Dep.target = _target;\n  }\n\n  function popTarget () {\n    Dep.target = targetStack.pop();\n  }\n\n  /*\n   * not type checking this file because flow doesn't play well with\n   * dynamically accessing methods on Array prototype\n   */\n\n  var arrayProto = Array.prototype;\n  var arrayMethods = Object.create(arrayProto);[\n    'push',\n    'pop',\n    'shift',\n    'unshift',\n    'splice',\n    'sort',\n    'reverse'\n  ]\n    .forEach(function (method) {\n      // cache original method\n      var original = arrayProto[method];\n      def(arrayMethods, method, function mutator () {\n        var arguments$1 = arguments;\n\n        // avoid leaking arguments:\n        // http://jsperf.com/closure-with-arguments\n        var i = arguments.length;\n        var args = new Array(i);\n        while (i--) {\n          args[i] = arguments$1[i];\n        }\n        var result = original.apply(this, args);\n        var ob = this.__ob__;\n        var inserted;\n        switch (method) {\n          case 'push':\n            inserted = args;\n            break\n          case 'unshift':\n            inserted = args;\n            break\n          case 'splice':\n            inserted = args.slice(2);\n            break\n        }\n        if (inserted) { ob.observeArray(inserted); }\n        // notify change\n        ob.dep.notify();\n        return result\n      });\n    });\n\n  /*  */\n\n  var arrayKeys = Object.getOwnPropertyNames(arrayMethods);\n\n  /**\n   * By default, when a reactive property is set, the new value is\n   * also converted to become reactive. However when passing down props,\n   * we don't want to force conversion because the value may be a nested value\n   * under a frozen data structure. Converting it would defeat the optimization.\n   */\n  var observerState = {\n    shouldConvert: true,\n    isSettingProps: false\n  };\n\n  /**\n   * Observer class that are attached to each observed\n   * object. Once attached, the observer converts target\n   * object's property keys into getter/setters that\n   * collect dependencies and dispatches updates.\n   */\n  var Observer = function Observer (value) {\n    this.value = value;\n    this.dep = new Dep();\n    this.vmCount = 0;\n    def(value, '__ob__', this);\n    if (Array.isArray(value)) {\n      var augment = hasProto\n        ? protoAugment\n        : copyAugment;\n      augment(value, arrayMethods, arrayKeys);\n      this.observeArray(value);\n    } else {\n      this.walk(value);\n    }\n  };\n\n  /**\n   * Walk through each property and convert them into\n   * getter/setters. This method should only be called when\n   * value type is Object.\n   */\n  Observer.prototype.walk = function walk (obj) {\n    var keys = Object.keys(obj);\n    for (var i = 0; i < keys.length; i++) {\n      defineReactive$$1(obj, keys[i], obj[keys[i]]);\n    }\n  };\n\n  /**\n   * Observe a list of Array items.\n   */\n  Observer.prototype.observeArray = function observeArray (items) {\n    for (var i = 0, l = items.length; i < l; i++) {\n      observe(items[i]);\n    }\n  };\n\n// helpers\n\n  /**\n   * Augment an target Object or Array by intercepting\n   * the prototype chain using __proto__\n   */\n  function protoAugment (target, src) {\n    /* eslint-disable no-proto */\n    target.__proto__ = src;\n    /* eslint-enable no-proto */\n  }\n\n  /**\n   * Augment an target Object or Array by defining\n   * hidden properties.\n   */\n  /* istanbul ignore next */\n  function copyAugment (target, src, keys) {\n    for (var i = 0, l = keys.length; i < l; i++) {\n      var key = keys[i];\n      def(target, key, src[key]);\n    }\n  }\n\n  /**\n   * Attempt to create an observer instance for a value,\n   * returns the new observer if successfully observed,\n   * or the existing observer if the value already has one.\n   */\n  function observe (value, asRootData) {\n    if (!isObject(value)) {\n      return\n    }\n    var ob;\n    if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {\n      ob = value.__ob__;\n    } else if (\n      observerState.shouldConvert &&\n      !isServerRendering() &&\n      (Array.isArray(value) || isPlainObject(value)) &&\n      Object.isExtensible(value) &&\n      !value._isVue\n    ) {\n      ob = new Observer(value);\n    }\n    if (asRootData && ob) {\n      ob.vmCount++;\n    }\n    return ob\n  }\n\n  /**\n   * Define a reactive property on an Object.\n   */\n  function defineReactive$$1 (\n    obj,\n    key,\n    val,\n    customSetter\n  ) {\n    var dep = new Dep();\n\n    var property = Object.getOwnPropertyDescriptor(obj, key);\n    if (property && property.configurable === false) {\n      return\n    }\n\n    // cater for pre-defined getter/setters\n    var getter = property && property.get;\n    var setter = property && property.set;\n\n    var childOb = observe(val);\n    Object.defineProperty(obj, key, {\n      enumerable: true,\n      configurable: true,\n      get: function reactiveGetter () {\n        var value = getter ? getter.call(obj) : val;\n        if (Dep.target) {\n          dep.depend();\n          if (childOb) {\n            childOb.dep.depend();\n          }\n          if (Array.isArray(value)) {\n            dependArray(value);\n          }\n        }\n        return value\n      },\n      set: function reactiveSetter (newVal) {\n        var value = getter ? getter.call(obj) : val;\n        /* eslint-disable no-self-compare */\n        if (newVal === value || (newVal !== newVal && value !== value)) {\n          return\n        }\n        /* eslint-enable no-self-compare */\n        if (\"development\" !== 'production' && customSetter) {\n          customSetter();\n        }\n        if (setter) {\n          setter.call(obj, newVal);\n        } else {\n          val = newVal;\n        }\n        childOb = observe(newVal);\n        dep.notify();\n      }\n    });\n  }\n\n  /**\n   * Set a property on an object. Adds the new property and\n   * triggers change notification if the property doesn't\n   * already exist.\n   */\n  function set (target, key, val) {\n    if (Array.isArray(target)) {\n      target.length = Math.max(target.length, key);\n      target.splice(key, 1, val);\n      return val\n    }\n    if (hasOwn(target, key)) {\n      target[key] = val;\n      return val\n    }\n    var ob = target.__ob__;\n    if (target._isVue || (ob && ob.vmCount)) {\n      \"development\" !== 'production' && warn(\n        'Avoid adding reactive properties to a Vue instance or its root $data ' +\n        'at runtime - declare it upfront in the data option.'\n      );\n      return val\n    }\n    if (!ob) {\n      target[key] = val;\n      return val\n    }\n    defineReactive$$1(ob.value, key, val);\n    ob.dep.notify();\n    return val\n  }\n\n  /**\n   * Delete a property and trigger change if necessary.\n   */\n  function del (target, key) {\n    if (Array.isArray(target)) {\n      target.splice(key, 1);\n      return\n    }\n    var ob = target.__ob__;\n    if (target._isVue || (ob && ob.vmCount)) {\n      \"development\" !== 'production' && warn(\n        'Avoid deleting properties on a Vue instance or its root $data ' +\n        '- just set it to null.'\n      );\n      return\n    }\n    if (!hasOwn(target, key)) {\n      return\n    }\n    delete target[key];\n    if (!ob) {\n      return\n    }\n    ob.dep.notify();\n  }\n\n  /**\n   * Collect dependencies on array elements when the array is touched, since\n   * we cannot intercept array element access like property getters.\n   */\n  function dependArray (value) {\n    for (var e = (void 0), i = 0, l = value.length; i < l; i++) {\n      e = value[i];\n      e && e.__ob__ && e.__ob__.dep.depend();\n      if (Array.isArray(e)) {\n        dependArray(e);\n      }\n    }\n  }\n\n  /*  */\n\n  /**\n   * Option overwriting strategies are functions that handle\n   * how to merge a parent option value and a child option\n   * value into the final value.\n   */\n  var strats = config.optionMergeStrategies;\n\n  /**\n   * Options with restrictions\n   */\n  {\n    strats.el = strats.propsData = function (parent, child, vm, key) {\n      if (!vm) {\n        warn(\n          \"option \\\"\" + key + \"\\\" can only be used during instance \" +\n          'creation with the `new` keyword.'\n        );\n      }\n      return defaultStrat(parent, child)\n    };\n  }\n\n  /**\n   * Helper that recursively merges two data objects together.\n   */\n  function mergeData (to, from) {\n    if (!from) { return to }\n    var key, toVal, fromVal;\n    var keys = Object.keys(from);\n    for (var i = 0; i < keys.length; i++) {\n      key = keys[i];\n      toVal = to[key];\n      fromVal = from[key];\n      if (!hasOwn(to, key)) {\n        set(to, key, fromVal);\n      } else if (isPlainObject(toVal) && isPlainObject(fromVal)) {\n        mergeData(toVal, fromVal);\n      }\n    }\n    return to\n  }\n\n  /**\n   * Data\n   */\n  strats.data = function (\n    parentVal,\n    childVal,\n    vm\n  ) {\n    if (!vm) {\n      // in a Vue.extend merge, both should be functions\n      if (!childVal) {\n        return parentVal\n      }\n      if (typeof childVal !== 'function') {\n        \"development\" !== 'production' && warn(\n          'The \"data\" option should be a function ' +\n          'that returns a per-instance value in component ' +\n          'definitions.',\n          vm\n        );\n        return parentVal\n      }\n      if (!parentVal) {\n        return childVal\n      }\n      // when parentVal & childVal are both present,\n      // we need to return a function that returns the\n      // merged result of both functions... no need to\n      // check if parentVal is a function here because\n      // it has to be a function to pass previous merges.\n      return function mergedDataFn () {\n        return mergeData(\n          childVal.call(this),\n          parentVal.call(this)\n        )\n      }\n    } else if (parentVal || childVal) {\n      return function mergedInstanceDataFn () {\n        // instance merge\n        var instanceData = typeof childVal === 'function'\n          ? childVal.call(vm)\n          : childVal;\n        var defaultData = typeof parentVal === 'function'\n          ? parentVal.call(vm)\n          : undefined;\n        if (instanceData) {\n          return mergeData(instanceData, defaultData)\n        } else {\n          return defaultData\n        }\n      }\n    }\n  };\n\n  /**\n   * Hooks and props are merged as arrays.\n   */\n  function mergeHook (\n    parentVal,\n    childVal\n  ) {\n    return childVal\n      ? parentVal\n        ? parentVal.concat(childVal)\n        : Array.isArray(childVal)\n          ? childVal\n          : [childVal]\n      : parentVal\n  }\n\n  config._lifecycleHooks.forEach(function (hook) {\n    strats[hook] = mergeHook;\n  });\n\n  /**\n   * Assets\n   *\n   * When a vm is present (instance creation), we need to do\n   * a three-way merge between constructor options, instance\n   * options and parent options.\n   */\n  function mergeAssets (parentVal, childVal) {\n    var res = Object.create(parentVal || null);\n    return childVal\n      ? extend(res, childVal)\n      : res\n  }\n\n  config._assetTypes.forEach(function (type) {\n    strats[type + 's'] = mergeAssets;\n  });\n\n  /**\n   * Watchers.\n   *\n   * Watchers hashes should not overwrite one\n   * another, so we merge them as arrays.\n   */\n  strats.watch = function (parentVal, childVal) {\n    /* istanbul ignore if */\n    if (!childVal) { return Object.create(parentVal || null) }\n    if (!parentVal) { return childVal }\n    var ret = {};\n    extend(ret, parentVal);\n    for (var key in childVal) {\n      var parent = ret[key];\n      var child = childVal[key];\n      if (parent && !Array.isArray(parent)) {\n        parent = [parent];\n      }\n      ret[key] = parent\n        ? parent.concat(child)\n        : [child];\n    }\n    return ret\n  };\n\n  /**\n   * Other object hashes.\n   */\n  strats.props =\n    strats.methods =\n      strats.computed = function (parentVal, childVal) {\n        if (!childVal) { return Object.create(parentVal || null) }\n        if (!parentVal) { return childVal }\n        var ret = Object.create(null);\n        extend(ret, parentVal);\n        extend(ret, childVal);\n        return ret\n      };\n\n  /**\n   * Default strategy.\n   */\n  var defaultStrat = function (parentVal, childVal) {\n    return childVal === undefined\n      ? parentVal\n      : childVal\n  };\n\n  /**\n   * Validate component names\n   */\n  function checkComponents (options) {\n    for (var key in options.components) {\n      var lower = key.toLowerCase();\n      if (isBuiltInTag(lower) || config.isReservedTag(lower)) {\n        warn(\n          'Do not use built-in or reserved HTML elements as component ' +\n          'id: ' + key\n        );\n      }\n    }\n  }\n\n  /**\n   * Ensure all props option syntax are normalized into the\n   * Object-based format.\n   */\n  function normalizeProps (options) {\n    var props = options.props;\n    if (!props) { return }\n    var res = {};\n    var i, val, name;\n    if (Array.isArray(props)) {\n      i = props.length;\n      while (i--) {\n        val = props[i];\n        if (typeof val === 'string') {\n          name = camelize(val);\n          res[name] = { type: null };\n        } else {\n          warn('props must be strings when using array syntax.');\n        }\n      }\n    } else if (isPlainObject(props)) {\n      for (var key in props) {\n        val = props[key];\n        name = camelize(key);\n        res[name] = isPlainObject(val)\n          ? val\n          : { type: val };\n      }\n    }\n    options.props = res;\n  }\n\n  /**\n   * Normalize raw function directives into object format.\n   */\n  function normalizeDirectives (options) {\n    var dirs = options.directives;\n    if (dirs) {\n      for (var key in dirs) {\n        var def = dirs[key];\n        if (typeof def === 'function') {\n          dirs[key] = { bind: def, update: def };\n        }\n      }\n    }\n  }\n\n  /**\n   * Merge two option objects into a new one.\n   * Core utility used in both instantiation and inheritance.\n   */\n  function mergeOptions (\n    parent,\n    child,\n    vm\n  ) {\n    {\n      checkComponents(child);\n    }\n    normalizeProps(child);\n    normalizeDirectives(child);\n    var extendsFrom = child.extends;\n    if (extendsFrom) {\n      parent = typeof extendsFrom === 'function'\n        ? mergeOptions(parent, extendsFrom.options, vm)\n        : mergeOptions(parent, extendsFrom, vm);\n    }\n    if (child.mixins) {\n      for (var i = 0, l = child.mixins.length; i < l; i++) {\n        var mixin = child.mixins[i];\n        if (mixin.prototype instanceof Vue$3) {\n          mixin = mixin.options;\n        }\n        parent = mergeOptions(parent, mixin, vm);\n      }\n    }\n    var options = {};\n    var key;\n    for (key in parent) {\n      mergeField(key);\n    }\n    for (key in child) {\n      if (!hasOwn(parent, key)) {\n        mergeField(key);\n      }\n    }\n    function mergeField (key) {\n      var strat = strats[key] || defaultStrat;\n      options[key] = strat(parent[key], child[key], vm, key);\n    }\n    return options\n  }\n\n  /**\n   * Resolve an asset.\n   * This function is used because child instances need access\n   * to assets defined in its ancestor chain.\n   */\n  function resolveAsset (\n    options,\n    type,\n    id,\n    warnMissing\n  ) {\n    /* istanbul ignore if */\n    if (typeof id !== 'string') {\n      return\n    }\n    var assets = options[type];\n    // check local registration variations first\n    if (hasOwn(assets, id)) { return assets[id] }\n    var camelizedId = camelize(id);\n    if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }\n    var PascalCaseId = capitalize(camelizedId);\n    if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }\n    // fallback to prototype chain\n    var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];\n    if (\"development\" !== 'production' && warnMissing && !res) {\n      warn(\n        'Failed to resolve ' + type.slice(0, -1) + ': ' + id,\n        options\n      );\n    }\n    return res\n  }\n\n  /*  */\n\n  function validateProp (\n    key,\n    propOptions,\n    propsData,\n    vm\n  ) {\n    var prop = propOptions[key];\n    var absent = !hasOwn(propsData, key);\n    var value = propsData[key];\n    // handle boolean props\n    if (isType(Boolean, prop.type)) {\n      if (absent && !hasOwn(prop, 'default')) {\n        value = false;\n      } else if (!isType(String, prop.type) && (value === '' || value === hyphenate(key))) {\n        value = true;\n      }\n    }\n    // check default value\n    if (value === undefined) {\n      value = getPropDefaultValue(vm, prop, key);\n      // since the default value is a fresh copy,\n      // make sure to observe it.\n      var prevShouldConvert = observerState.shouldConvert;\n      observerState.shouldConvert = true;\n      observe(value);\n      observerState.shouldConvert = prevShouldConvert;\n    }\n    {\n      assertProp(prop, key, value, vm, absent);\n    }\n    return value\n  }\n\n  /**\n   * Get the default value of a prop.\n   */\n  function getPropDefaultValue (vm, prop, key) {\n    // no default, return undefined\n    if (!hasOwn(prop, 'default')) {\n      return undefined\n    }\n    var def = prop.default;\n    // warn against non-factory defaults for Object & Array\n    if (\"development\" !== 'production' && isObject(def)) {\n      warn(\n        'Invalid default value for prop \"' + key + '\": ' +\n        'Props with type Object/Array must use a factory function ' +\n        'to return the default value.',\n        vm\n      );\n    }\n    // the raw prop value was also undefined from previous render,\n    // return previous default value to avoid unnecessary watcher trigger\n    if (vm && vm.$options.propsData &&\n      vm.$options.propsData[key] === undefined &&\n      vm._props[key] !== undefined) {\n      return vm._props[key]\n    }\n    // call factory function for non-Function types\n    // a value is Function if its prototype is function even across different execution context\n    return typeof def === 'function' && getType(prop.type) !== 'Function'\n      ? def.call(vm)\n      : def\n  }\n\n  /**\n   * Assert whether a prop is valid.\n   */\n  function assertProp (\n    prop,\n    name,\n    value,\n    vm,\n    absent\n  ) {\n    if (prop.required && absent) {\n      warn(\n        'Missing required prop: \"' + name + '\"',\n        vm\n      );\n      return\n    }\n    if (value == null && !prop.required) {\n      return\n    }\n    var type = prop.type;\n    var valid = !type || type === true;\n    var expectedTypes = [];\n    if (type) {\n      if (!Array.isArray(type)) {\n        type = [type];\n      }\n      for (var i = 0; i < type.length && !valid; i++) {\n        var assertedType = assertType(value, type[i]);\n        expectedTypes.push(assertedType.expectedType || '');\n        valid = assertedType.valid;\n      }\n    }\n    if (!valid) {\n      warn(\n        'Invalid prop: type check failed for prop \"' + name + '\".' +\n        ' Expected ' + expectedTypes.map(capitalize).join(', ') +\n        ', got ' + Object.prototype.toString.call(value).slice(8, -1) + '.',\n        vm\n      );\n      return\n    }\n    var validator = prop.validator;\n    if (validator) {\n      if (!validator(value)) {\n        warn(\n          'Invalid prop: custom validator check failed for prop \"' + name + '\".',\n          vm\n        );\n      }\n    }\n  }\n\n  /**\n   * Assert the type of a value\n   */\n  function assertType (value, type) {\n    var valid;\n    var expectedType = getType(type);\n    if (expectedType === 'String') {\n      valid = typeof value === (expectedType = 'string');\n    } else if (expectedType === 'Number') {\n      valid = typeof value === (expectedType = 'number');\n    } else if (expectedType === 'Boolean') {\n      valid = typeof value === (expectedType = 'boolean');\n    } else if (expectedType === 'Function') {\n      valid = typeof value === (expectedType = 'function');\n    } else if (expectedType === 'Object') {\n      valid = isPlainObject(value);\n    } else if (expectedType === 'Array') {\n      valid = Array.isArray(value);\n    } else {\n      valid = value instanceof type;\n    }\n    return {\n      valid: valid,\n      expectedType: expectedType\n    }\n  }\n\n  /**\n   * Use function string name to check built-in types,\n   * because a simple equality check will fail when running\n   * across different vms / iframes.\n   */\n  function getType (fn) {\n    var match = fn && fn.toString().match(/^\\s*function (\\w+)/);\n    return match && match[1]\n  }\n\n  function isType (type, fn) {\n    if (!Array.isArray(fn)) {\n      return getType(fn) === getType(type)\n    }\n    for (var i = 0, len = fn.length; i < len; i++) {\n      if (getType(fn[i]) === getType(type)) {\n        return true\n      }\n    }\n    /* istanbul ignore next */\n    return false\n  }\n\n  function handleError (err, vm, info) {\n    if (config.errorHandler) {\n      config.errorHandler.call(null, err, vm, info);\n    } else {\n      {\n        warn((\"Error in \" + info + \":\"), vm);\n      }\n      /* istanbul ignore else */\n      if (inBrowser && typeof console !== 'undefined') {\n        console.error(err);\n      } else {\n        throw err\n      }\n    }\n  }\n\n  /* not type checking this file because flow doesn't play well with Proxy */\n\n  var initProxy;\n\n  {\n    var allowedGlobals = makeMap(\n      'Infinity,undefined,NaN,isFinite,isNaN,' +\n      'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +\n      'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +\n      'require' // for Webpack/Browserify\n    );\n\n    var warnNonPresent = function (target, key) {\n      warn(\n        \"Property or method \\\"\" + key + \"\\\" is not defined on the instance but \" +\n        \"referenced during render. Make sure to declare reactive data \" +\n        \"properties in the data option.\",\n        target\n      );\n    };\n\n    var hasProxy =\n      typeof Proxy !== 'undefined' &&\n      Proxy.toString().match(/native code/);\n\n    if (hasProxy) {\n      var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta');\n      config.keyCodes = new Proxy(config.keyCodes, {\n        set: function set (target, key, value) {\n          if (isBuiltInModifier(key)) {\n            warn((\"Avoid overwriting built-in modifier in config.keyCodes: .\" + key));\n            return false\n          } else {\n            target[key] = value;\n            return true\n          }\n        }\n      });\n    }\n\n    var hasHandler = {\n      has: function has (target, key) {\n        var has = key in target;\n        var isAllowed = allowedGlobals(key) || key.charAt(0) === '_';\n        if (!has && !isAllowed) {\n          warnNonPresent(target, key);\n        }\n        return has || !isAllowed\n      }\n    };\n\n    var getHandler = {\n      get: function get (target, key) {\n        if (typeof key === 'string' && !(key in target)) {\n          warnNonPresent(target, key);\n        }\n        return target[key]\n      }\n    };\n\n    initProxy = function initProxy (vm) {\n      if (hasProxy) {\n        // determine which proxy handler to use\n        var options = vm.$options;\n        var handlers = options.render && options.render._withStripped\n          ? getHandler\n          : hasHandler;\n        vm._renderProxy = new Proxy(vm, handlers);\n      } else {\n        vm._renderProxy = vm;\n      }\n    };\n  }\n\n  var mark;\n  var measure;\n\n  {\n    var perf = inBrowser && window.performance;\n    /* istanbul ignore if */\n    if (\n      perf &&\n      perf.mark &&\n      perf.measure &&\n      perf.clearMarks &&\n      perf.clearMeasures\n    ) {\n      mark = function (tag) { return perf.mark(tag); };\n      measure = function (name, startTag, endTag) {\n        perf.measure(name, startTag, endTag);\n        perf.clearMarks(startTag);\n        perf.clearMarks(endTag);\n        perf.clearMeasures(name);\n      };\n    }\n  }\n\n  /*  */\n\n  var VNode = function VNode (\n    tag,\n    data,\n    children,\n    text,\n    elm,\n    context,\n    componentOptions\n  ) {\n    this.tag = tag;\n    this.data = data;\n    this.children = children;\n    this.text = text;\n    this.elm = elm;\n    this.ns = undefined;\n    this.context = context;\n    this.functionalContext = undefined;\n    this.key = data && data.key;\n    this.componentOptions = componentOptions;\n    this.componentInstance = undefined;\n    this.parent = undefined;\n    this.raw = false;\n    this.isStatic = false;\n    this.isRootInsert = true;\n    this.isComment = false;\n    this.isCloned = false;\n    this.isOnce = false;\n  };\n\n  var prototypeAccessors = { child: {} };\n\n// DEPRECATED: alias for componentInstance for backwards compat.\n  /* istanbul ignore next */\n  prototypeAccessors.child.get = function () {\n    return this.componentInstance\n  };\n\n  Object.defineProperties( VNode.prototype, prototypeAccessors );\n\n  var createEmptyVNode = function () {\n    var node = new VNode();\n    node.text = '';\n    node.isComment = true;\n    return node\n  };\n\n  function createTextVNode (val) {\n    return new VNode(undefined, undefined, undefined, String(val))\n  }\n\n// optimized shallow clone\n// used for static nodes and slot nodes because they may be reused across\n// multiple renders, cloning them avoids errors when DOM manipulations rely\n// on their elm reference.\n  function cloneVNode (vnode) {\n    var cloned = new VNode(\n      vnode.tag,\n      vnode.data,\n      vnode.children,\n      vnode.text,\n      vnode.elm,\n      vnode.context,\n      vnode.componentOptions\n    );\n    cloned.ns = vnode.ns;\n    cloned.isStatic = vnode.isStatic;\n    cloned.key = vnode.key;\n    cloned.isCloned = true;\n    return cloned\n  }\n\n  function cloneVNodes (vnodes) {\n    var len = vnodes.length;\n    var res = new Array(len);\n    for (var i = 0; i < len; i++) {\n      res[i] = cloneVNode(vnodes[i]);\n    }\n    return res\n  }\n\n  /*  */\n\n  var normalizeEvent = cached(function (name) {\n    var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first\n    name = once$$1 ? name.slice(1) : name;\n    var capture = name.charAt(0) === '!';\n    name = capture ? name.slice(1) : name;\n    return {\n      name: name,\n      once: once$$1,\n      capture: capture\n    }\n  });\n\n  function createFnInvoker (fns) {\n    function invoker () {\n      var arguments$1 = arguments;\n\n      var fns = invoker.fns;\n      if (Array.isArray(fns)) {\n        for (var i = 0; i < fns.length; i++) {\n          fns[i].apply(null, arguments$1);\n        }\n      } else {\n        // return handler return value for single handlers\n        return fns.apply(null, arguments)\n      }\n    }\n    invoker.fns = fns;\n    return invoker\n  }\n\n  function updateListeners (\n    on,\n    oldOn,\n    add,\n    remove$$1,\n    vm\n  ) {\n    var name, cur, old, event;\n    for (name in on) {\n      cur = on[name];\n      old = oldOn[name];\n      event = normalizeEvent(name);\n      if (!cur) {\n        \"development\" !== 'production' && warn(\n          \"Invalid handler for event \\\"\" + (event.name) + \"\\\": got \" + String(cur),\n          vm\n        );\n      } else if (!old) {\n        if (!cur.fns) {\n          cur = on[name] = createFnInvoker(cur);\n        }\n        add(event.name, cur, event.once, event.capture);\n      } else if (cur !== old) {\n        old.fns = cur;\n        on[name] = old;\n      }\n    }\n    for (name in oldOn) {\n      if (!on[name]) {\n        event = normalizeEvent(name);\n        remove$$1(event.name, oldOn[name], event.capture);\n      }\n    }\n  }\n\n  /*  */\n\n  function mergeVNodeHook (def, hookKey, hook) {\n    var invoker;\n    var oldHook = def[hookKey];\n\n    function wrappedHook () {\n      hook.apply(this, arguments);\n      // important: remove merged hook to ensure it's called only once\n      // and prevent memory leak\n      remove(invoker.fns, wrappedHook);\n    }\n\n    if (!oldHook) {\n      // no existing hook\n      invoker = createFnInvoker([wrappedHook]);\n    } else {\n      /* istanbul ignore if */\n      if (oldHook.fns && oldHook.merged) {\n        // already a merged invoker\n        invoker = oldHook;\n        invoker.fns.push(wrappedHook);\n      } else {\n        // existing plain hook\n        invoker = createFnInvoker([oldHook, wrappedHook]);\n      }\n    }\n\n    invoker.merged = true;\n    def[hookKey] = invoker;\n  }\n\n  /*  */\n\n// The template compiler attempts to minimize the need for normalization by\n// statically analyzing the template at compile time.\n//\n// For plain HTML markup, normalization can be completely skipped because the\n// generated render function is guaranteed to return Array<VNode>. There are\n// two cases where extra normalization is needed:\n\n// 1. When the children contains components - because a functional component\n// may return an Array instead of a single root. In this case, just a simple\n// normalization is needed - if any child is an Array, we flatten the whole\n// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep\n// because functional components already normalize their own children.\n  function simpleNormalizeChildren (children) {\n    for (var i = 0; i < children.length; i++) {\n      if (Array.isArray(children[i])) {\n        return Array.prototype.concat.apply([], children)\n      }\n    }\n    return children\n  }\n\n// 2. When the children contains constructs that always generated nested Arrays,\n// e.g. <template>, <slot>, v-for, or when the children is provided by user\n// with hand-written render functions / JSX. In such cases a full normalization\n// is needed to cater to all possible types of children values.\n  function normalizeChildren (children) {\n    return isPrimitive(children)\n      ? [createTextVNode(children)]\n      : Array.isArray(children)\n        ? normalizeArrayChildren(children)\n        : undefined\n  }\n\n  function normalizeArrayChildren (children, nestedIndex) {\n    var res = [];\n    var i, c, last;\n    for (i = 0; i < children.length; i++) {\n      c = children[i];\n      if (c == null || typeof c === 'boolean') { continue }\n      last = res[res.length - 1];\n      //  nested\n      if (Array.isArray(c)) {\n        res.push.apply(res, normalizeArrayChildren(c, ((nestedIndex || '') + \"_\" + i)));\n      } else if (isPrimitive(c)) {\n        if (last && last.text) {\n          last.text += String(c);\n        } else if (c !== '') {\n          // convert primitive to vnode\n          res.push(createTextVNode(c));\n        }\n      } else {\n        if (c.text && last && last.text) {\n          res[res.length - 1] = createTextVNode(last.text + c.text);\n        } else {\n          // default key for nested array children (likely generated by v-for)\n          if (c.tag && c.key == null && nestedIndex != null) {\n            c.key = \"__vlist\" + nestedIndex + \"_\" + i + \"__\";\n          }\n          res.push(c);\n        }\n      }\n    }\n    return res\n  }\n\n  /*  */\n\n  function getFirstComponentChild (children) {\n    return children && children.filter(function (c) { return c && c.componentOptions; })[0]\n  }\n\n  /*  */\n\n  function initEvents (vm) {\n    vm._events = Object.create(null);\n    vm._hasHookEvent = false;\n    // init parent attached events\n    var listeners = vm.$options._parentListeners;\n    if (listeners) {\n      updateComponentListeners(vm, listeners);\n    }\n  }\n\n  var target;\n\n  function add (event, fn, once$$1) {\n    if (once$$1) {\n      target.$once(event, fn);\n    } else {\n      target.$on(event, fn);\n    }\n  }\n\n  function remove$1 (event, fn) {\n    target.$off(event, fn);\n  }\n\n  function updateComponentListeners (\n    vm,\n    listeners,\n    oldListeners\n  ) {\n    target = vm;\n    updateListeners(listeners, oldListeners || {}, add, remove$1, vm);\n  }\n\n  function eventsMixin (Vue) {\n    var hookRE = /^hook:/;\n    Vue.prototype.$on = function (event, fn) {\n      var this$1 = this;\n\n      var vm = this;\n      if (Array.isArray(event)) {\n        for (var i = 0, l = event.length; i < l; i++) {\n          this$1.$on(event[i], fn);\n        }\n      } else {\n        (vm._events[event] || (vm._events[event] = [])).push(fn);\n        // optimize hook:event cost by using a boolean flag marked at registration\n        // instead of a hash lookup\n        if (hookRE.test(event)) {\n          vm._hasHookEvent = true;\n        }\n      }\n      return vm\n    };\n\n    Vue.prototype.$once = function (event, fn) {\n      var vm = this;\n      function on () {\n        vm.$off(event, on);\n        fn.apply(vm, arguments);\n      }\n      on.fn = fn;\n      vm.$on(event, on);\n      return vm\n    };\n\n    Vue.prototype.$off = function (event, fn) {\n      var this$1 = this;\n\n      var vm = this;\n      // all\n      if (!arguments.length) {\n        vm._events = Object.create(null);\n        return vm\n      }\n      // array of events\n      if (Array.isArray(event)) {\n        for (var i$1 = 0, l = event.length; i$1 < l; i$1++) {\n          this$1.$off(event[i$1], fn);\n        }\n        return vm\n      }\n      // specific event\n      var cbs = vm._events[event];\n      if (!cbs) {\n        return vm\n      }\n      if (arguments.length === 1) {\n        vm._events[event] = null;\n        return vm\n      }\n      // specific handler\n      var cb;\n      var i = cbs.length;\n      while (i--) {\n        cb = cbs[i];\n        if (cb === fn || cb.fn === fn) {\n          cbs.splice(i, 1);\n          break\n        }\n      }\n      return vm\n    };\n\n    Vue.prototype.$emit = function (event) {\n      var vm = this;\n      var cbs = vm._events[event];\n      if (cbs) {\n        cbs = cbs.length > 1 ? toArray(cbs) : cbs;\n        var args = toArray(arguments, 1);\n        for (var i = 0, l = cbs.length; i < l; i++) {\n          cbs[i].apply(vm, args);\n        }\n      }\n      return vm\n    };\n  }\n\n  /*  */\n\n  /**\n   * Runtime helper for resolving raw children VNodes into a slot object.\n   */\n  function resolveSlots (\n    children,\n    context\n  ) {\n    var slots = {};\n    if (!children) {\n      return slots\n    }\n    var defaultSlot = [];\n    var name, child;\n    for (var i = 0, l = children.length; i < l; i++) {\n      child = children[i];\n      // named slots should only be respected if the vnode was rendered in the\n      // same context.\n      if ((child.context === context || child.functionalContext === context) &&\n        child.data && (name = child.data.slot)) {\n        var slot = (slots[name] || (slots[name] = []));\n        if (child.tag === 'template') {\n          slot.push.apply(slot, child.children);\n        } else {\n          slot.push(child);\n        }\n      } else {\n        defaultSlot.push(child);\n      }\n    }\n    // ignore whitespace\n    if (!defaultSlot.every(isWhitespace)) {\n      slots.default = defaultSlot;\n    }\n    return slots\n  }\n\n  function isWhitespace (node) {\n    return node.isComment || node.text === ' '\n  }\n\n  function resolveScopedSlots (\n    fns\n  ) {\n    var res = {};\n    for (var i = 0; i < fns.length; i++) {\n      res[fns[i][0]] = fns[i][1];\n    }\n    return res\n  }\n\n  /*  */\n\n  var activeInstance = null;\n\n  function initLifecycle (vm) {\n    var options = vm.$options;\n\n    // locate first non-abstract parent\n    var parent = options.parent;\n    if (parent && !options.abstract) {\n      while (parent.$options.abstract && parent.$parent) {\n        parent = parent.$parent;\n      }\n      parent.$children.push(vm);\n    }\n\n    vm.$parent = parent;\n    vm.$root = parent ? parent.$root : vm;\n\n    vm.$children = [];\n    vm.$refs = {};\n\n    vm._watcher = null;\n    vm._inactive = null;\n    vm._directInactive = false;\n    vm._isMounted = false;\n    vm._isDestroyed = false;\n    vm._isBeingDestroyed = false;\n  }\n\n  function lifecycleMixin (Vue) {\n    Vue.prototype._update = function (vnode, hydrating) {\n      var vm = this;\n      if (vm._isMounted) {\n        callHook(vm, 'beforeUpdate');\n      }\n      var prevEl = vm.$el;\n      var prevVnode = vm._vnode;\n      var prevActiveInstance = activeInstance;\n      activeInstance = vm;\n      vm._vnode = vnode;\n      // Vue.prototype.__patch__ is injected in entry points\n      // based on the rendering backend used.\n      if (!prevVnode) {\n        // initial render\n        vm.$el = vm.__patch__(\n          vm.$el, vnode, hydrating, false /* removeOnly */,\n          vm.$options._parentElm,\n          vm.$options._refElm\n        );\n      } else {\n        // updates\n        vm.$el = vm.__patch__(prevVnode, vnode);\n      }\n      activeInstance = prevActiveInstance;\n      // update __vue__ reference\n      if (prevEl) {\n        prevEl.__vue__ = null;\n      }\n      if (vm.$el) {\n        vm.$el.__vue__ = vm;\n      }\n      // if parent is an HOC, update its $el as well\n      if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {\n        vm.$parent.$el = vm.$el;\n      }\n      // updated hook is called by the scheduler to ensure that children are\n      // updated in a parent's updated hook.\n    };\n\n    Vue.prototype.$forceUpdate = function () {\n      var vm = this;\n      if (vm._watcher) {\n        vm._watcher.update();\n      }\n    };\n\n    Vue.prototype.$destroy = function () {\n      var vm = this;\n      if (vm._isBeingDestroyed) {\n        return\n      }\n      callHook(vm, 'beforeDestroy');\n      vm._isBeingDestroyed = true;\n      // remove self from parent\n      var parent = vm.$parent;\n      if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {\n        remove(parent.$children, vm);\n      }\n      // teardown watchers\n      if (vm._watcher) {\n        vm._watcher.teardown();\n      }\n      var i = vm._watchers.length;\n      while (i--) {\n        vm._watchers[i].teardown();\n      }\n      // remove reference from data ob\n      // frozen object may not have observer.\n      if (vm._data.__ob__) {\n        vm._data.__ob__.vmCount--;\n      }\n      // call the last hook...\n      vm._isDestroyed = true;\n      callHook(vm, 'destroyed');\n      // turn off all instance listeners.\n      vm.$off();\n      // remove __vue__ reference\n      if (vm.$el) {\n        vm.$el.__vue__ = null;\n      }\n      // invoke destroy hooks on current rendered tree\n      vm.__patch__(vm._vnode, null);\n    };\n  }\n\n  function mountComponent (\n    vm,\n    el,\n    hydrating\n  ) {\n    vm.$el = el;\n    if (!vm.$options.render) {\n      vm.$options.render = createEmptyVNode;\n      {\n        /* istanbul ignore if */\n        if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') ||\n          vm.$options.el || el) {\n          warn(\n            'You are using the runtime-only build of Vue where the template ' +\n            'compiler is not available. Either pre-compile the templates into ' +\n            'render functions, or use the compiler-included build.',\n            vm\n          );\n        } else {\n          warn(\n            'Failed to mount component: template or render function not defined.',\n            vm\n          );\n        }\n      }\n    }\n    callHook(vm, 'beforeMount');\n\n    var updateComponent;\n    /* istanbul ignore if */\n    if (\"development\" !== 'production' && config.performance && mark) {\n      updateComponent = function () {\n        var name = vm._name;\n        var startTag = \"start \" + name;\n        var endTag = \"end \" + name;\n\n        mark(startTag);\n        var vnode = vm._render();\n        mark(endTag);\n        measure((name + \" render\"), startTag, endTag);\n\n        mark(startTag);\n        vm._update(vnode, hydrating);\n        mark(endTag);\n        measure((name + \" patch\"), startTag, endTag);\n      };\n    } else {\n      updateComponent = function () {\n        vm._update(vm._render(), hydrating);\n      };\n    }\n\n    vm._watcher = new Watcher(vm, updateComponent, noop);\n    hydrating = false;\n\n    // manually mounted instance, call mounted on self\n    // mounted is called for render-created child components in its inserted hook\n    if (vm.$vnode == null) {\n      vm._isMounted = true;\n      callHook(vm, 'mounted');\n    }\n    return vm\n  }\n\n  function updateChildComponent (\n    vm,\n    propsData,\n    listeners,\n    parentVnode,\n    renderChildren\n  ) {\n    // determine whether component has slot children\n    // we need to do this before overwriting $options._renderChildren\n    var hasChildren = !!(\n      renderChildren ||               // has new static slots\n      vm.$options._renderChildren ||  // has old static slots\n      parentVnode.data.scopedSlots || // has new scoped slots\n      vm.$scopedSlots !== emptyObject // has old scoped slots\n    );\n\n    vm.$options._parentVnode = parentVnode;\n    vm.$vnode = parentVnode; // update vm's placeholder node without re-render\n    if (vm._vnode) { // update child tree's parent\n      vm._vnode.parent = parentVnode;\n    }\n    vm.$options._renderChildren = renderChildren;\n\n    // update props\n    if (propsData && vm.$options.props) {\n      observerState.shouldConvert = false;\n      {\n        observerState.isSettingProps = true;\n      }\n      var props = vm._props;\n      var propKeys = vm.$options._propKeys || [];\n      for (var i = 0; i < propKeys.length; i++) {\n        var key = propKeys[i];\n        props[key] = validateProp(key, vm.$options.props, propsData, vm);\n      }\n      observerState.shouldConvert = true;\n      {\n        observerState.isSettingProps = false;\n      }\n      // keep a copy of raw propsData\n      vm.$options.propsData = propsData;\n    }\n    // update listeners\n    if (listeners) {\n      var oldListeners = vm.$options._parentListeners;\n      vm.$options._parentListeners = listeners;\n      updateComponentListeners(vm, listeners, oldListeners);\n    }\n    // resolve slots + force update if has children\n    if (hasChildren) {\n      vm.$slots = resolveSlots(renderChildren, parentVnode.context);\n      vm.$forceUpdate();\n    }\n  }\n\n  function isInInactiveTree (vm) {\n    while (vm && (vm = vm.$parent)) {\n      if (vm._inactive) { return true }\n    }\n    return false\n  }\n\n  function activateChildComponent (vm, direct) {\n    if (direct) {\n      vm._directInactive = false;\n      if (isInInactiveTree(vm)) {\n        return\n      }\n    } else if (vm._directInactive) {\n      return\n    }\n    if (vm._inactive || vm._inactive == null) {\n      vm._inactive = false;\n      for (var i = 0; i < vm.$children.length; i++) {\n        activateChildComponent(vm.$children[i]);\n      }\n      callHook(vm, 'activated');\n    }\n  }\n\n  function deactivateChildComponent (vm, direct) {\n    if (direct) {\n      vm._directInactive = true;\n      if (isInInactiveTree(vm)) {\n        return\n      }\n    }\n    if (!vm._inactive) {\n      vm._inactive = true;\n      for (var i = 0; i < vm.$children.length; i++) {\n        deactivateChildComponent(vm.$children[i]);\n      }\n      callHook(vm, 'deactivated');\n    }\n  }\n\n  function callHook (vm, hook) {\n    var handlers = vm.$options[hook];\n    if (handlers) {\n      for (var i = 0, j = handlers.length; i < j; i++) {\n        try {\n          handlers[i].call(vm);\n        } catch (e) {\n          handleError(e, vm, (hook + \" hook\"));\n        }\n      }\n    }\n    if (vm._hasHookEvent) {\n      vm.$emit('hook:' + hook);\n    }\n  }\n\n  /*  */\n\n\n  var queue = [];\n  var has = {};\n  var circular = {};\n  var waiting = false;\n  var flushing = false;\n  var index = 0;\n\n  /**\n   * Reset the scheduler's state.\n   */\n  function resetSchedulerState () {\n    queue.length = 0;\n    has = {};\n    {\n      circular = {};\n    }\n    waiting = flushing = false;\n  }\n\n  /**\n   * Flush both queues and run the watchers.\n   */\n  function flushSchedulerQueue () {\n    flushing = true;\n    var watcher, id, vm;\n\n    // Sort queue before flush.\n    // This ensures that:\n    // 1. Components are updated from parent to child. (because parent is always\n    //    created before the child)\n    // 2. A component's user watchers are run before its render watcher (because\n    //    user watchers are created before the render watcher)\n    // 3. If a component is destroyed during a parent component's watcher run,\n    //    its watchers can be skipped.\n    queue.sort(function (a, b) { return a.id - b.id; });\n\n    // do not cache length because more watchers might be pushed\n    // as we run existing watchers\n    for (index = 0; index < queue.length; index++) {\n      watcher = queue[index];\n      id = watcher.id;\n      has[id] = null;\n      watcher.run();\n      // in dev build, check and stop circular updates.\n      if (\"development\" !== 'production' && has[id] != null) {\n        circular[id] = (circular[id] || 0) + 1;\n        if (circular[id] > config._maxUpdateCount) {\n          warn(\n            'You may have an infinite update loop ' + (\n              watcher.user\n                ? (\"in watcher with expression \\\"\" + (watcher.expression) + \"\\\"\")\n                : \"in a component render function.\"\n            ),\n            watcher.vm\n          );\n          break\n        }\n      }\n    }\n\n    // call updated hooks\n    index = queue.length;\n    while (index--) {\n      watcher = queue[index];\n      vm = watcher.vm;\n      if (vm._watcher === watcher && vm._isMounted) {\n        callHook(vm, 'updated');\n      }\n    }\n\n    // devtool hook\n    /* istanbul ignore if */\n    if (devtools && config.devtools) {\n      devtools.emit('flush');\n    }\n\n    resetSchedulerState();\n  }\n\n  /**\n   * Push a watcher into the watcher queue.\n   * Jobs with duplicate IDs will be skipped unless it's\n   * pushed when the queue is being flushed.\n   */\n  function queueWatcher (watcher) {\n    var id = watcher.id;\n    if (has[id] == null) {\n      has[id] = true;\n      if (!flushing) {\n        queue.push(watcher);\n      } else {\n        // if already flushing, splice the watcher based on its id\n        // if already past its id, it will be run next immediately.\n        var i = queue.length - 1;\n        while (i >= 0 && queue[i].id > watcher.id) {\n          i--;\n        }\n        queue.splice(Math.max(i, index) + 1, 0, watcher);\n      }\n      // queue the flush\n      if (!waiting) {\n        waiting = true;\n        nextTick(flushSchedulerQueue);\n      }\n    }\n  }\n\n  /*  */\n\n  var uid$2 = 0;\n\n  /**\n   * A watcher parses an expression, collects dependencies,\n   * and fires callback when the expression value changes.\n   * This is used for both the $watch() api and directives.\n   */\n  var Watcher = function Watcher (\n    vm,\n    expOrFn,\n    cb,\n    options\n  ) {\n    this.vm = vm;\n    vm._watchers.push(this);\n    // options\n    if (options) {\n      this.deep = !!options.deep;\n      this.user = !!options.user;\n      this.lazy = !!options.lazy;\n      this.sync = !!options.sync;\n    } else {\n      this.deep = this.user = this.lazy = this.sync = false;\n    }\n    this.cb = cb;\n    this.id = ++uid$2; // uid for batching\n    this.active = true;\n    this.dirty = this.lazy; // for lazy watchers\n    this.deps = [];\n    this.newDeps = [];\n    this.depIds = new _Set();\n    this.newDepIds = new _Set();\n    this.expression = expOrFn.toString();\n    // parse expression for getter\n    if (typeof expOrFn === 'function') {\n      this.getter = expOrFn;\n    } else {\n      this.getter = parsePath(expOrFn);\n      if (!this.getter) {\n        this.getter = function () {};\n        \"development\" !== 'production' && warn(\n          \"Failed watching path: \\\"\" + expOrFn + \"\\\" \" +\n          'Watcher only accepts simple dot-delimited paths. ' +\n          'For full control, use a function instead.',\n          vm\n        );\n      }\n    }\n    this.value = this.lazy\n      ? undefined\n      : this.get();\n  };\n\n  /**\n   * Evaluate the getter, and re-collect dependencies.\n   */\n  Watcher.prototype.get = function get () {\n    pushTarget(this);\n    var value;\n    var vm = this.vm;\n    if (this.user) {\n      try {\n        value = this.getter.call(vm, vm);\n      } catch (e) {\n        handleError(e, vm, (\"getter for watcher \\\"\" + (this.expression) + \"\\\"\"));\n      }\n    } else {\n      value = this.getter.call(vm, vm);\n    }\n    // \"touch\" every property so they are all tracked as\n    // dependencies for deep watching\n    if (this.deep) {\n      traverse(value);\n    }\n    popTarget();\n    this.cleanupDeps();\n    return value\n  };\n\n  /**\n   * Add a dependency to this directive.\n   */\n  Watcher.prototype.addDep = function addDep (dep) {\n    var id = dep.id;\n    if (!this.newDepIds.has(id)) {\n      this.newDepIds.add(id);\n      this.newDeps.push(dep);\n      if (!this.depIds.has(id)) {\n        dep.addSub(this);\n      }\n    }\n  };\n\n  /**\n   * Clean up for dependency collection.\n   */\n  Watcher.prototype.cleanupDeps = function cleanupDeps () {\n    var this$1 = this;\n\n    var i = this.deps.length;\n    while (i--) {\n      var dep = this$1.deps[i];\n      if (!this$1.newDepIds.has(dep.id)) {\n        dep.removeSub(this$1);\n      }\n    }\n    var tmp = this.depIds;\n    this.depIds = this.newDepIds;\n    this.newDepIds = tmp;\n    this.newDepIds.clear();\n    tmp = this.deps;\n    this.deps = this.newDeps;\n    this.newDeps = tmp;\n    this.newDeps.length = 0;\n  };\n\n  /**\n   * Subscriber interface.\n   * Will be called when a dependency changes.\n   */\n  Watcher.prototype.update = function update () {\n    /* istanbul ignore else */\n    if (this.lazy) {\n      this.dirty = true;\n    } else if (this.sync) {\n      this.run();\n    } else {\n      queueWatcher(this);\n    }\n  };\n\n  /**\n   * Scheduler job interface.\n   * Will be called by the scheduler.\n   */\n  Watcher.prototype.run = function run () {\n    if (this.active) {\n      var value = this.get();\n      if (\n        value !== this.value ||\n        // Deep watchers and watchers on Object/Arrays should fire even\n        // when the value is the same, because the value may\n        // have mutated.\n        isObject(value) ||\n        this.deep\n      ) {\n        // set new value\n        var oldValue = this.value;\n        this.value = value;\n        if (this.user) {\n          try {\n            this.cb.call(this.vm, value, oldValue);\n          } catch (e) {\n            handleError(e, this.vm, (\"callback for watcher \\\"\" + (this.expression) + \"\\\"\"));\n          }\n        } else {\n          this.cb.call(this.vm, value, oldValue);\n        }\n      }\n    }\n  };\n\n  /**\n   * Evaluate the value of the watcher.\n   * This only gets called for lazy watchers.\n   */\n  Watcher.prototype.evaluate = function evaluate () {\n    this.value = this.get();\n    this.dirty = false;\n  };\n\n  /**\n   * Depend on all deps collected by this watcher.\n   */\n  Watcher.prototype.depend = function depend () {\n    var this$1 = this;\n\n    var i = this.deps.length;\n    while (i--) {\n      this$1.deps[i].depend();\n    }\n  };\n\n  /**\n   * Remove self from all dependencies' subscriber list.\n   */\n  Watcher.prototype.teardown = function teardown () {\n    var this$1 = this;\n\n    if (this.active) {\n      // remove self from vm's watcher list\n      // this is a somewhat expensive operation so we skip it\n      // if the vm is being destroyed.\n      if (!this.vm._isBeingDestroyed) {\n        remove(this.vm._watchers, this);\n      }\n      var i = this.deps.length;\n      while (i--) {\n        this$1.deps[i].removeSub(this$1);\n      }\n      this.active = false;\n    }\n  };\n\n  /**\n   * Recursively traverse an object to evoke all converted\n   * getters, so that every nested property inside the object\n   * is collected as a \"deep\" dependency.\n   */\n  var seenObjects = new _Set();\n  function traverse (val) {\n    seenObjects.clear();\n    _traverse(val, seenObjects);\n  }\n\n  function _traverse (val, seen) {\n    var i, keys;\n    var isA = Array.isArray(val);\n    if ((!isA && !isObject(val)) || !Object.isExtensible(val)) {\n      return\n    }\n    if (val.__ob__) {\n      var depId = val.__ob__.dep.id;\n      if (seen.has(depId)) {\n        return\n      }\n      seen.add(depId);\n    }\n    if (isA) {\n      i = val.length;\n      while (i--) { _traverse(val[i], seen); }\n    } else {\n      keys = Object.keys(val);\n      i = keys.length;\n      while (i--) { _traverse(val[keys[i]], seen); }\n    }\n  }\n\n  /*  */\n\n  var sharedPropertyDefinition = {\n    enumerable: true,\n    configurable: true,\n    get: noop,\n    set: noop\n  };\n\n  function proxy (target, sourceKey, key) {\n    sharedPropertyDefinition.get = function proxyGetter () {\n      return this[sourceKey][key]\n    };\n    sharedPropertyDefinition.set = function proxySetter (val) {\n      this[sourceKey][key] = val;\n    };\n    Object.defineProperty(target, key, sharedPropertyDefinition);\n  }\n\n  function initState (vm) {\n    vm._watchers = [];\n    var opts = vm.$options;\n    if (opts.props) { initProps(vm, opts.props); }\n    if (opts.methods) { initMethods(vm, opts.methods); }\n    if (opts.data) {\n      initData(vm);\n    } else {\n      observe(vm._data = {}, true /* asRootData */);\n    }\n    if (opts.computed) { initComputed(vm, opts.computed); }\n    if (opts.watch) { initWatch(vm, opts.watch); }\n  }\n\n  var isReservedProp = { key: 1, ref: 1, slot: 1 };\n\n  function initProps (vm, propsOptions) {\n    var propsData = vm.$options.propsData || {};\n    var props = vm._props = {};\n    // cache prop keys so that future props updates can iterate using Array\n    // instead of dynamic object key enumeration.\n    var keys = vm.$options._propKeys = [];\n    var isRoot = !vm.$parent;\n    // root instance props should be converted\n    observerState.shouldConvert = isRoot;\n    var loop = function ( key ) {\n      keys.push(key);\n      var value = validateProp(key, propsOptions, propsData, vm);\n      /* istanbul ignore else */\n      {\n        if (isReservedProp[key]) {\n          warn(\n            (\"\\\"\" + key + \"\\\" is a reserved attribute and cannot be used as component prop.\"),\n            vm\n          );\n        }\n        defineReactive$$1(props, key, value, function () {\n          if (vm.$parent && !observerState.isSettingProps) {\n            warn(\n              \"Avoid mutating a prop directly since the value will be \" +\n              \"overwritten whenever the parent component re-renders. \" +\n              \"Instead, use a data or computed property based on the prop's \" +\n              \"value. Prop being mutated: \\\"\" + key + \"\\\"\",\n              vm\n            );\n          }\n        });\n      }\n      // static props are already proxied on the component's prototype\n      // during Vue.extend(). We only need to proxy props defined at\n      // instantiation here.\n      if (!(key in vm)) {\n        proxy(vm, \"_props\", key);\n      }\n    };\n\n    for (var key in propsOptions) loop( key );\n    observerState.shouldConvert = true;\n  }\n\n  function initData (vm) {\n    var data = vm.$options.data;\n    data = vm._data = typeof data === 'function'\n      ? data.call(vm)\n      : data || {};\n    if (!isPlainObject(data)) {\n      data = {};\n      \"development\" !== 'production' && warn(\n        'data functions should return an object:\\n' +\n        'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',\n        vm\n      );\n    }\n    // proxy data on instance\n    var keys = Object.keys(data);\n    var props = vm.$options.props;\n    var i = keys.length;\n    while (i--) {\n      if (props && hasOwn(props, keys[i])) {\n        \"development\" !== 'production' && warn(\n          \"The data property \\\"\" + (keys[i]) + \"\\\" is already declared as a prop. \" +\n          \"Use prop default value instead.\",\n          vm\n        );\n      } else if (!isReserved(keys[i])) {\n        proxy(vm, \"_data\", keys[i]);\n      }\n    }\n    // observe data\n    observe(data, true /* asRootData */);\n  }\n\n  var computedWatcherOptions = { lazy: true };\n\n  function initComputed (vm, computed) {\n    var watchers = vm._computedWatchers = Object.create(null);\n\n    for (var key in computed) {\n      var userDef = computed[key];\n      var getter = typeof userDef === 'function' ? userDef : userDef.get;\n      // create internal watcher for the computed property.\n      watchers[key] = new Watcher(vm, getter, noop, computedWatcherOptions);\n\n      // component-defined computed properties are already defined on the\n      // component prototype. We only need to define computed properties defined\n      // at instantiation here.\n      if (!(key in vm)) {\n        defineComputed(vm, key, userDef);\n      }\n    }\n  }\n\n  function defineComputed (target, key, userDef) {\n    if (typeof userDef === 'function') {\n      sharedPropertyDefinition.get = createComputedGetter(key);\n      sharedPropertyDefinition.set = noop;\n    } else {\n      sharedPropertyDefinition.get = userDef.get\n        ? userDef.cache !== false\n          ? createComputedGetter(key)\n          : userDef.get\n        : noop;\n      sharedPropertyDefinition.set = userDef.set\n        ? userDef.set\n        : noop;\n    }\n    Object.defineProperty(target, key, sharedPropertyDefinition);\n  }\n\n  function createComputedGetter (key) {\n    return function computedGetter () {\n      var watcher = this._computedWatchers && this._computedWatchers[key];\n      if (watcher) {\n        if (watcher.dirty) {\n          watcher.evaluate();\n        }\n        if (Dep.target) {\n          watcher.depend();\n        }\n        return watcher.value\n      }\n    }\n  }\n\n  function initMethods (vm, methods) {\n    var props = vm.$options.props;\n    for (var key in methods) {\n      vm[key] = methods[key] == null ? noop : bind(methods[key], vm);\n      {\n        if (methods[key] == null) {\n          warn(\n            \"method \\\"\" + key + \"\\\" has an undefined value in the component definition. \" +\n            \"Did you reference the function correctly?\",\n            vm\n          );\n        }\n        if (props && hasOwn(props, key)) {\n          warn(\n            (\"method \\\"\" + key + \"\\\" has already been defined as a prop.\"),\n            vm\n          );\n        }\n      }\n    }\n  }\n\n  function initWatch (vm, watch) {\n    for (var key in watch) {\n      var handler = watch[key];\n      if (Array.isArray(handler)) {\n        for (var i = 0; i < handler.length; i++) {\n          createWatcher(vm, key, handler[i]);\n        }\n      } else {\n        createWatcher(vm, key, handler);\n      }\n    }\n  }\n\n  function createWatcher (vm, key, handler) {\n    var options;\n    if (isPlainObject(handler)) {\n      options = handler;\n      handler = handler.handler;\n    }\n    if (typeof handler === 'string') {\n      handler = vm[handler];\n    }\n    vm.$watch(key, handler, options);\n  }\n\n  function stateMixin (Vue) {\n    // flow somehow has problems with directly declared definition object\n    // when using Object.defineProperty, so we have to procedurally build up\n    // the object here.\n    var dataDef = {};\n    dataDef.get = function () { return this._data };\n    var propsDef = {};\n    propsDef.get = function () { return this._props };\n    {\n      dataDef.set = function (newData) {\n        warn(\n          'Avoid replacing instance root $data. ' +\n          'Use nested data properties instead.',\n          this\n        );\n      };\n      propsDef.set = function () {\n        warn(\"$props is readonly.\", this);\n      };\n    }\n    Object.defineProperty(Vue.prototype, '$data', dataDef);\n    Object.defineProperty(Vue.prototype, '$props', propsDef);\n\n    Vue.prototype.$set = set;\n    Vue.prototype.$delete = del;\n\n    Vue.prototype.$watch = function (\n      expOrFn,\n      cb,\n      options\n    ) {\n      var vm = this;\n      options = options || {};\n      options.user = true;\n      var watcher = new Watcher(vm, expOrFn, cb, options);\n      if (options.immediate) {\n        cb.call(vm, watcher.value);\n      }\n      return function unwatchFn () {\n        watcher.teardown();\n      }\n    };\n  }\n\n  /*  */\n\n// hooks to be invoked on component VNodes during patch\n  var componentVNodeHooks = {\n    init: function init (\n      vnode,\n      hydrating,\n      parentElm,\n      refElm\n    ) {\n      if (!vnode.componentInstance || vnode.componentInstance._isDestroyed) {\n        var child = vnode.componentInstance = createComponentInstanceForVnode(\n          vnode,\n          activeInstance,\n          parentElm,\n          refElm\n        );\n        child.$mount(hydrating ? vnode.elm : undefined, hydrating);\n      } else if (vnode.data.keepAlive) {\n        // kept-alive components, treat as a patch\n        var mountedNode = vnode; // work around flow\n        componentVNodeHooks.prepatch(mountedNode, mountedNode);\n      }\n    },\n\n    prepatch: function prepatch (oldVnode, vnode) {\n      var options = vnode.componentOptions;\n      var child = vnode.componentInstance = oldVnode.componentInstance;\n      updateChildComponent(\n        child,\n        options.propsData, // updated props\n        options.listeners, // updated listeners\n        vnode, // new parent vnode\n        options.children // new children\n      );\n    },\n\n    insert: function insert (vnode) {\n      if (!vnode.componentInstance._isMounted) {\n        vnode.componentInstance._isMounted = true;\n        callHook(vnode.componentInstance, 'mounted');\n      }\n      if (vnode.data.keepAlive) {\n        activateChildComponent(vnode.componentInstance, true /* direct */);\n      }\n    },\n\n    destroy: function destroy (vnode) {\n      if (!vnode.componentInstance._isDestroyed) {\n        if (!vnode.data.keepAlive) {\n          vnode.componentInstance.$destroy();\n        } else {\n          deactivateChildComponent(vnode.componentInstance, true /* direct */);\n        }\n      }\n    }\n  };\n\n  var hooksToMerge = Object.keys(componentVNodeHooks);\n\n  function createComponent (\n    Ctor,\n    data,\n    context,\n    children,\n    tag\n  ) {\n    if (!Ctor) {\n      return\n    }\n\n    var baseCtor = context.$options._base;\n    if (isObject(Ctor)) {\n      Ctor = baseCtor.extend(Ctor);\n    }\n\n    if (typeof Ctor !== 'function') {\n      {\n        warn((\"Invalid Component definition: \" + (String(Ctor))), context);\n      }\n      return\n    }\n\n    // async component\n    if (!Ctor.cid) {\n      if (Ctor.resolved) {\n        Ctor = Ctor.resolved;\n      } else {\n        Ctor = resolveAsyncComponent(Ctor, baseCtor, function () {\n          // it's ok to queue this on every render because\n          // $forceUpdate is buffered by the scheduler.\n          context.$forceUpdate();\n        });\n        if (!Ctor) {\n          // return nothing if this is indeed an async component\n          // wait for the callback to trigger parent update.\n          return\n        }\n      }\n    }\n\n    // resolve constructor options in case global mixins are applied after\n    // component constructor creation\n    resolveConstructorOptions(Ctor);\n\n    data = data || {};\n\n    // transform component v-model data into props & events\n    if (data.model) {\n      transformModel(Ctor.options, data);\n    }\n\n    // extract props\n    var propsData = extractProps(data, Ctor);\n\n    // functional component\n    if (Ctor.options.functional) {\n      return createFunctionalComponent(Ctor, propsData, data, context, children)\n    }\n\n    // extract listeners, since these needs to be treated as\n    // child component listeners instead of DOM listeners\n    var listeners = data.on;\n    // replace with listeners with .native modifier\n    data.on = data.nativeOn;\n\n    if (Ctor.options.abstract) {\n      // abstract components do not keep anything\n      // other than props & listeners\n      data = {};\n    }\n\n    // merge component management hooks onto the placeholder node\n    mergeHooks(data);\n\n    // return a placeholder vnode\n    var name = Ctor.options.name || tag;\n    var vnode = new VNode(\n      (\"vue-component-\" + (Ctor.cid) + (name ? (\"-\" + name) : '')),\n      data, undefined, undefined, undefined, context,\n      { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children }\n    );\n    return vnode\n  }\n\n  function createFunctionalComponent (\n    Ctor,\n    propsData,\n    data,\n    context,\n    children\n  ) {\n    var props = {};\n    var propOptions = Ctor.options.props;\n    if (propOptions) {\n      for (var key in propOptions) {\n        props[key] = validateProp(key, propOptions, propsData);\n      }\n    }\n    // ensure the createElement function in functional components\n    // gets a unique context - this is necessary for correct named slot check\n    var _context = Object.create(context);\n    var h = function (a, b, c, d) { return createElement(_context, a, b, c, d, true); };\n    var vnode = Ctor.options.render.call(null, h, {\n      props: props,\n      data: data,\n      parent: context,\n      children: children,\n      slots: function () { return resolveSlots(children, context); }\n    });\n    if (vnode instanceof VNode) {\n      vnode.functionalContext = context;\n      if (data.slot) {\n        (vnode.data || (vnode.data = {})).slot = data.slot;\n      }\n    }\n    return vnode\n  }\n\n  function createComponentInstanceForVnode (\n    vnode, // we know it's MountedComponentVNode but flow doesn't\n    parent, // activeInstance in lifecycle state\n    parentElm,\n    refElm\n  ) {\n    var vnodeComponentOptions = vnode.componentOptions;\n    var options = {\n      _isComponent: true,\n      parent: parent,\n      propsData: vnodeComponentOptions.propsData,\n      _componentTag: vnodeComponentOptions.tag,\n      _parentVnode: vnode,\n      _parentListeners: vnodeComponentOptions.listeners,\n      _renderChildren: vnodeComponentOptions.children,\n      _parentElm: parentElm || null,\n      _refElm: refElm || null\n    };\n    // check inline-template render functions\n    var inlineTemplate = vnode.data.inlineTemplate;\n    if (inlineTemplate) {\n      options.render = inlineTemplate.render;\n      options.staticRenderFns = inlineTemplate.staticRenderFns;\n    }\n    return new vnodeComponentOptions.Ctor(options)\n  }\n\n  function resolveAsyncComponent (\n    factory,\n    baseCtor,\n    cb\n  ) {\n    if (factory.requested) {\n      // pool callbacks\n      factory.pendingCallbacks.push(cb);\n    } else {\n      factory.requested = true;\n      var cbs = factory.pendingCallbacks = [cb];\n      var sync = true;\n\n      var resolve = function (res) {\n        if (isObject(res)) {\n          res = baseCtor.extend(res);\n        }\n        // cache resolved\n        factory.resolved = res;\n        // invoke callbacks only if this is not a synchronous resolve\n        // (async resolves are shimmed as synchronous during SSR)\n        if (!sync) {\n          for (var i = 0, l = cbs.length; i < l; i++) {\n            cbs[i](res);\n          }\n        }\n      };\n\n      var reject = function (reason) {\n        \"development\" !== 'production' && warn(\n          \"Failed to resolve async component: \" + (String(factory)) +\n          (reason ? (\"\\nReason: \" + reason) : '')\n        );\n      };\n\n      var res = factory(resolve, reject);\n\n      // handle promise\n      if (res && typeof res.then === 'function' && !factory.resolved) {\n        res.then(resolve, reject);\n      }\n\n      sync = false;\n      // return in case resolved synchronously\n      return factory.resolved\n    }\n  }\n\n  function extractProps (data, Ctor) {\n    // we are only extracting raw values here.\n    // validation and default values are handled in the child\n    // component itself.\n    var propOptions = Ctor.options.props;\n    if (!propOptions) {\n      return\n    }\n    var res = {};\n    var attrs = data.attrs;\n    var props = data.props;\n    var domProps = data.domProps;\n    if (attrs || props || domProps) {\n      for (var key in propOptions) {\n        var altKey = hyphenate(key);\n        {\n          var keyInLowerCase = key.toLowerCase();\n          if (\n            key !== keyInLowerCase &&\n            attrs && attrs.hasOwnProperty(keyInLowerCase)\n          ) {\n            warn(\n              \"Prop \\\"\" + keyInLowerCase + \"\\\" is not declared in component \" +\n              (formatComponentName(Ctor)) + \". Note that HTML attributes are \" +\n              \"case-insensitive and camelCased props need to use their kebab-case \" +\n              \"equivalents when using in-DOM templates. You should probably use \" +\n              \"\\\"\" + altKey + \"\\\" instead of \\\"\" + key + \"\\\".\"\n            );\n          }\n        }\n        checkProp(res, props, key, altKey, true) ||\n        checkProp(res, attrs, key, altKey) ||\n        checkProp(res, domProps, key, altKey);\n      }\n    }\n    return res\n  }\n\n  function checkProp (\n    res,\n    hash,\n    key,\n    altKey,\n    preserve\n  ) {\n    if (hash) {\n      if (hasOwn(hash, key)) {\n        res[key] = hash[key];\n        if (!preserve) {\n          delete hash[key];\n        }\n        return true\n      } else if (hasOwn(hash, altKey)) {\n        res[key] = hash[altKey];\n        if (!preserve) {\n          delete hash[altKey];\n        }\n        return true\n      }\n    }\n    return false\n  }\n\n  function mergeHooks (data) {\n    if (!data.hook) {\n      data.hook = {};\n    }\n    for (var i = 0; i < hooksToMerge.length; i++) {\n      var key = hooksToMerge[i];\n      var fromParent = data.hook[key];\n      var ours = componentVNodeHooks[key];\n      data.hook[key] = fromParent ? mergeHook$1(ours, fromParent) : ours;\n    }\n  }\n\n  function mergeHook$1 (one, two) {\n    return function (a, b, c, d) {\n      one(a, b, c, d);\n      two(a, b, c, d);\n    }\n  }\n\n// transform component v-model info (value and callback) into\n// prop and event handler respectively.\n  function transformModel (options, data) {\n    var prop = (options.model && options.model.prop) || 'value';\n    var event = (options.model && options.model.event) || 'input';(data.props || (data.props = {}))[prop] = data.model.value;\n    var on = data.on || (data.on = {});\n    if (on[event]) {\n      on[event] = [data.model.callback].concat(on[event]);\n    } else {\n      on[event] = data.model.callback;\n    }\n  }\n\n  /*  */\n\n  var SIMPLE_NORMALIZE = 1;\n  var ALWAYS_NORMALIZE = 2;\n\n// wrapper function for providing a more flexible interface\n// without getting yelled at by flow\n  function createElement (\n    context,\n    tag,\n    data,\n    children,\n    normalizationType,\n    alwaysNormalize\n  ) {\n    if (Array.isArray(data) || isPrimitive(data)) {\n      normalizationType = children;\n      children = data;\n      data = undefined;\n    }\n    if (alwaysNormalize) { normalizationType = ALWAYS_NORMALIZE; }\n    return _createElement(context, tag, data, children, normalizationType)\n  }\n\n  function _createElement (\n    context,\n    tag,\n    data,\n    children,\n    normalizationType\n  ) {\n    if (data && data.__ob__) {\n      \"development\" !== 'production' && warn(\n        \"Avoid using observed data object as vnode data: \" + (JSON.stringify(data)) + \"\\n\" +\n        'Always create fresh vnode data objects in each render!',\n        context\n      );\n      return createEmptyVNode()\n    }\n    if (!tag) {\n      // in case of component :is set to falsy value\n      return createEmptyVNode()\n    }\n    // support single function children as default scoped slot\n    if (Array.isArray(children) &&\n      typeof children[0] === 'function') {\n      data = data || {};\n      data.scopedSlots = { default: children[0] };\n      children.length = 0;\n    }\n    if (normalizationType === ALWAYS_NORMALIZE) {\n      children = normalizeChildren(children);\n    } else if (normalizationType === SIMPLE_NORMALIZE) {\n      children = simpleNormalizeChildren(children);\n    }\n    var vnode, ns;\n    if (typeof tag === 'string') {\n      var Ctor;\n      ns = config.getTagNamespace(tag);\n      if (config.isReservedTag(tag)) {\n        // platform built-in elements\n        vnode = new VNode(\n          config.parsePlatformTagName(tag), data, children,\n          undefined, undefined, context\n        );\n      } else if ((Ctor = resolveAsset(context.$options, 'components', tag))) {\n        // component\n        vnode = createComponent(Ctor, data, context, children, tag);\n      } else {\n        // unknown or unlisted namespaced elements\n        // check at runtime because it may get assigned a namespace when its\n        // parent normalizes children\n        vnode = new VNode(\n          tag, data, children,\n          undefined, undefined, context\n        );\n      }\n    } else {\n      // direct component options / constructor\n      vnode = createComponent(tag, data, context, children);\n    }\n    if (vnode) {\n      if (ns) { applyNS(vnode, ns); }\n      return vnode\n    } else {\n      return createEmptyVNode()\n    }\n  }\n\n  function applyNS (vnode, ns) {\n    vnode.ns = ns;\n    if (vnode.tag === 'foreignObject') {\n      // use default namespace inside foreignObject\n      return\n    }\n    if (vnode.children) {\n      for (var i = 0, l = vnode.children.length; i < l; i++) {\n        var child = vnode.children[i];\n        if (child.tag && !child.ns) {\n          applyNS(child, ns);\n        }\n      }\n    }\n  }\n\n  /*  */\n\n  /**\n   * Runtime helper for rendering v-for lists.\n   */\n  function renderList (\n    val,\n    render\n  ) {\n    var ret, i, l, keys, key;\n    if (Array.isArray(val) || typeof val === 'string') {\n      ret = new Array(val.length);\n      for (i = 0, l = val.length; i < l; i++) {\n        ret[i] = render(val[i], i);\n      }\n    } else if (typeof val === 'number') {\n      ret = new Array(val);\n      for (i = 0; i < val; i++) {\n        ret[i] = render(i + 1, i);\n      }\n    } else if (isObject(val)) {\n      keys = Object.keys(val);\n      ret = new Array(keys.length);\n      for (i = 0, l = keys.length; i < l; i++) {\n        key = keys[i];\n        ret[i] = render(val[key], key, i);\n      }\n    }\n    return ret\n  }\n\n  /*  */\n\n  /**\n   * Runtime helper for rendering <slot>\n   */\n  function renderSlot (\n    name,\n    fallback,\n    props,\n    bindObject\n  ) {\n    var scopedSlotFn = this.$scopedSlots[name];\n    if (scopedSlotFn) { // scoped slot\n      props = props || {};\n      if (bindObject) {\n        extend(props, bindObject);\n      }\n      return scopedSlotFn(props) || fallback\n    } else {\n      var slotNodes = this.$slots[name];\n      // warn duplicate slot usage\n      if (slotNodes && \"development\" !== 'production') {\n        slotNodes._rendered && warn(\n          \"Duplicate presence of slot \\\"\" + name + \"\\\" found in the same render tree \" +\n          \"- this will likely cause render errors.\",\n          this\n        );\n        slotNodes._rendered = true;\n      }\n      return slotNodes || fallback\n    }\n  }\n\n  /*  */\n\n  /**\n   * Runtime helper for resolving filters\n   */\n  function resolveFilter (id) {\n    return resolveAsset(this.$options, 'filters', id, true) || identity\n  }\n\n  /*  */\n\n  /**\n   * Runtime helper for checking keyCodes from config.\n   */\n  function checkKeyCodes (\n    eventKeyCode,\n    key,\n    builtInAlias\n  ) {\n    var keyCodes = config.keyCodes[key] || builtInAlias;\n    if (Array.isArray(keyCodes)) {\n      return keyCodes.indexOf(eventKeyCode) === -1\n    } else {\n      return keyCodes !== eventKeyCode\n    }\n  }\n\n  /*  */\n\n  /**\n   * Runtime helper for merging v-bind=\"object\" into a VNode's data.\n   */\n  function bindObjectProps (\n    data,\n    tag,\n    value,\n    asProp\n  ) {\n    if (value) {\n      if (!isObject(value)) {\n        \"development\" !== 'production' && warn(\n          'v-bind without argument expects an Object or Array value',\n          this\n        );\n      } else {\n        if (Array.isArray(value)) {\n          value = toObject(value);\n        }\n        var hash;\n        for (var key in value) {\n          if (key === 'class' || key === 'style') {\n            hash = data;\n          } else {\n            var type = data.attrs && data.attrs.type;\n            hash = asProp || config.mustUseProp(tag, type, key)\n              ? data.domProps || (data.domProps = {})\n              : data.attrs || (data.attrs = {});\n          }\n          if (!(key in hash)) {\n            hash[key] = value[key];\n          }\n        }\n      }\n    }\n    return data\n  }\n\n  /*  */\n\n  /**\n   * Runtime helper for rendering static trees.\n   */\n  function renderStatic (\n    index,\n    isInFor\n  ) {\n    var tree = this._staticTrees[index];\n    // if has already-rendered static tree and not inside v-for,\n    // we can reuse the same tree by doing a shallow clone.\n    if (tree && !isInFor) {\n      return Array.isArray(tree)\n        ? cloneVNodes(tree)\n        : cloneVNode(tree)\n    }\n    // otherwise, render a fresh tree.\n    tree = this._staticTrees[index] =\n      this.$options.staticRenderFns[index].call(this._renderProxy);\n    markStatic(tree, (\"__static__\" + index), false);\n    return tree\n  }\n\n  /**\n   * Runtime helper for v-once.\n   * Effectively it means marking the node as static with a unique key.\n   */\n  function markOnce (\n    tree,\n    index,\n    key\n  ) {\n    markStatic(tree, (\"__once__\" + index + (key ? (\"_\" + key) : \"\")), true);\n    return tree\n  }\n\n  function markStatic (\n    tree,\n    key,\n    isOnce\n  ) {\n    if (Array.isArray(tree)) {\n      for (var i = 0; i < tree.length; i++) {\n        if (tree[i] && typeof tree[i] !== 'string') {\n          markStaticNode(tree[i], (key + \"_\" + i), isOnce);\n        }\n      }\n    } else {\n      markStaticNode(tree, key, isOnce);\n    }\n  }\n\n  function markStaticNode (node, key, isOnce) {\n    node.isStatic = true;\n    node.key = key;\n    node.isOnce = isOnce;\n  }\n\n  /*  */\n\n  function initRender (vm) {\n    vm.$vnode = null; // the placeholder node in parent tree\n    vm._vnode = null; // the root of the child tree\n    vm._staticTrees = null;\n    var parentVnode = vm.$options._parentVnode;\n    var renderContext = parentVnode && parentVnode.context;\n    vm.$slots = resolveSlots(vm.$options._renderChildren, renderContext);\n    vm.$scopedSlots = emptyObject;\n    // bind the createElement fn to this instance\n    // so that we get proper render context inside it.\n    // args order: tag, data, children, normalizationType, alwaysNormalize\n    // internal version is used by render functions compiled from templates\n    vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };\n    // normalization is always applied for the public version, used in\n    // user-written render functions.\n    vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };\n  }\n\n  function renderMixin (Vue) {\n    Vue.prototype.$nextTick = function (fn) {\n      return nextTick(fn, this)\n    };\n\n    Vue.prototype._render = function () {\n      var vm = this;\n      var ref = vm.$options;\n      var render = ref.render;\n      var staticRenderFns = ref.staticRenderFns;\n      var _parentVnode = ref._parentVnode;\n\n      if (vm._isMounted) {\n        // clone slot nodes on re-renders\n        for (var key in vm.$slots) {\n          vm.$slots[key] = cloneVNodes(vm.$slots[key]);\n        }\n      }\n\n      vm.$scopedSlots = (_parentVnode && _parentVnode.data.scopedSlots) || emptyObject;\n\n      if (staticRenderFns && !vm._staticTrees) {\n        vm._staticTrees = [];\n      }\n      // set parent vnode. this allows render functions to have access\n      // to the data on the placeholder node.\n      vm.$vnode = _parentVnode;\n      // render self\n      var vnode;\n      try {\n        vnode = render.call(vm._renderProxy, vm.$createElement);\n      } catch (e) {\n        handleError(e, vm, \"render function\");\n        // return error render result,\n        // or previous vnode to prevent render error causing blank component\n        /* istanbul ignore else */\n        {\n          vnode = vm.$options.renderError\n            ? vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e)\n            : vm._vnode;\n        }\n      }\n      // return empty vnode in case the render function errored out\n      if (!(vnode instanceof VNode)) {\n        if (\"development\" !== 'production' && Array.isArray(vnode)) {\n          warn(\n            'Multiple root nodes returned from render function. Render function ' +\n            'should return a single root node.',\n            vm\n          );\n        }\n        vnode = createEmptyVNode();\n      }\n      // set parent\n      vnode.parent = _parentVnode;\n      return vnode\n    };\n\n    // internal render helpers.\n    // these are exposed on the instance prototype to reduce generated render\n    // code size.\n    Vue.prototype._o = markOnce;\n    Vue.prototype._n = toNumber;\n    Vue.prototype._s = _toString;\n    Vue.prototype._l = renderList;\n    Vue.prototype._t = renderSlot;\n    Vue.prototype._q = looseEqual;\n    Vue.prototype._i = looseIndexOf;\n    Vue.prototype._m = renderStatic;\n    Vue.prototype._f = resolveFilter;\n    Vue.prototype._k = checkKeyCodes;\n    Vue.prototype._b = bindObjectProps;\n    Vue.prototype._v = createTextVNode;\n    Vue.prototype._e = createEmptyVNode;\n    Vue.prototype._u = resolveScopedSlots;\n  }\n\n  /*  */\n\n  function initProvide (vm) {\n    var provide = vm.$options.provide;\n    if (provide) {\n      vm._provided = typeof provide === 'function'\n        ? provide.call(vm)\n        : provide;\n    }\n  }\n\n  function initInjections (vm) {\n    var inject = vm.$options.inject;\n    if (inject) {\n      // inject is :any because flow is not smart enough to figure out cached\n      // isArray here\n      var isArray = Array.isArray(inject);\n      var keys = isArray\n        ? inject\n        : hasSymbol\n          ? Reflect.ownKeys(inject)\n          : Object.keys(inject);\n\n      for (var i = 0; i < keys.length; i++) {\n        var key = keys[i];\n        var provideKey = isArray ? key : inject[key];\n        var source = vm;\n        while (source) {\n          if (source._provided && provideKey in source._provided) {\n            vm[key] = source._provided[provideKey];\n            break\n          }\n          source = source.$parent;\n        }\n      }\n    }\n  }\n\n  /*  */\n\n  var uid = 0;\n\n  function initMixin (Vue) {\n    Vue.prototype._init = function (options) {\n      /* istanbul ignore if */\n      if (\"development\" !== 'production' && config.performance && mark) {\n        mark('init');\n      }\n\n      var vm = this;\n      // a uid\n      vm._uid = uid++;\n      // a flag to avoid this being observed\n      vm._isVue = true;\n      // merge options\n      if (options && options._isComponent) {\n        // optimize internal component instantiation\n        // since dynamic options merging is pretty slow, and none of the\n        // internal component options needs special treatment.\n        initInternalComponent(vm, options);\n      } else {\n        vm.$options = mergeOptions(\n          resolveConstructorOptions(vm.constructor),\n          options || {},\n          vm\n        );\n      }\n      /* istanbul ignore else */\n      {\n        initProxy(vm);\n      }\n      // expose real self\n      vm._self = vm;\n      initLifecycle(vm);\n      initEvents(vm);\n      initRender(vm);\n      callHook(vm, 'beforeCreate');\n      initInjections(vm); // resolve injections before data/props\n      initState(vm);\n      initProvide(vm); // resolve provide after data/props\n      callHook(vm, 'created');\n\n      /* istanbul ignore if */\n      if (\"development\" !== 'production' && config.performance && mark) {\n        vm._name = formatComponentName(vm, false);\n        mark('init end');\n        measure(((vm._name) + \" init\"), 'init', 'init end');\n      }\n\n      if (vm.$options.el) {\n        vm.$mount(vm.$options.el);\n      }\n    };\n  }\n\n  function initInternalComponent (vm, options) {\n    var opts = vm.$options = Object.create(vm.constructor.options);\n    // doing this because it's faster than dynamic enumeration.\n    opts.parent = options.parent;\n    opts.propsData = options.propsData;\n    opts._parentVnode = options._parentVnode;\n    opts._parentListeners = options._parentListeners;\n    opts._renderChildren = options._renderChildren;\n    opts._componentTag = options._componentTag;\n    opts._parentElm = options._parentElm;\n    opts._refElm = options._refElm;\n    if (options.render) {\n      opts.render = options.render;\n      opts.staticRenderFns = options.staticRenderFns;\n    }\n  }\n\n  function resolveConstructorOptions (Ctor) {\n    var options = Ctor.options;\n    if (Ctor.super) {\n      var superOptions = resolveConstructorOptions(Ctor.super);\n      var cachedSuperOptions = Ctor.superOptions;\n      if (superOptions !== cachedSuperOptions) {\n        // super option changed,\n        // need to resolve new options.\n        Ctor.superOptions = superOptions;\n        // check if there are any late-modified/attached options (#4976)\n        var modifiedOptions = resolveModifiedOptions(Ctor);\n        // update base extend options\n        if (modifiedOptions) {\n          extend(Ctor.extendOptions, modifiedOptions);\n        }\n        options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions);\n        if (options.name) {\n          options.components[options.name] = Ctor;\n        }\n      }\n    }\n    return options\n  }\n\n  function resolveModifiedOptions (Ctor) {\n    var modified;\n    var latest = Ctor.options;\n    var sealed = Ctor.sealedOptions;\n    for (var key in latest) {\n      if (latest[key] !== sealed[key]) {\n        if (!modified) { modified = {}; }\n        modified[key] = dedupe(latest[key], sealed[key]);\n      }\n    }\n    return modified\n  }\n\n  function dedupe (latest, sealed) {\n    // compare latest and sealed to ensure lifecycle hooks won't be duplicated\n    // between merges\n    if (Array.isArray(latest)) {\n      var res = [];\n      sealed = Array.isArray(sealed) ? sealed : [sealed];\n      for (var i = 0; i < latest.length; i++) {\n        if (sealed.indexOf(latest[i]) < 0) {\n          res.push(latest[i]);\n        }\n      }\n      return res\n    } else {\n      return latest\n    }\n  }\n\n  function Vue$3 (options) {\n    if (\"development\" !== 'production' &&\n      !(this instanceof Vue$3)) {\n      warn('Vue is a constructor and should be called with the `new` keyword');\n    }\n    this._init(options);\n  }\n\n  initMixin(Vue$3);\n  stateMixin(Vue$3);\n  eventsMixin(Vue$3);\n  lifecycleMixin(Vue$3);\n  renderMixin(Vue$3);\n\n  /*  */\n\n  function initUse (Vue) {\n    Vue.use = function (plugin) {\n      /* istanbul ignore if */\n      if (plugin.installed) {\n        return\n      }\n      // additional parameters\n      var args = toArray(arguments, 1);\n      args.unshift(this);\n      if (typeof plugin.install === 'function') {\n        plugin.install.apply(plugin, args);\n      } else if (typeof plugin === 'function') {\n        plugin.apply(null, args);\n      }\n      plugin.installed = true;\n      return this\n    };\n  }\n\n  /*  */\n\n  function initMixin$1 (Vue) {\n    Vue.mixin = function (mixin) {\n      this.options = mergeOptions(this.options, mixin);\n    };\n  }\n\n  /*  */\n\n  function initExtend (Vue) {\n    /**\n     * Each instance constructor, including Vue, has a unique\n     * cid. This enables us to create wrapped \"child\n     * constructors\" for prototypal inheritance and cache them.\n     */\n    Vue.cid = 0;\n    var cid = 1;\n\n    /**\n     * Class inheritance\n     */\n    Vue.extend = function (extendOptions) {\n      extendOptions = extendOptions || {};\n      var Super = this;\n      var SuperId = Super.cid;\n      var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});\n      if (cachedCtors[SuperId]) {\n        return cachedCtors[SuperId]\n      }\n\n      var name = extendOptions.name || Super.options.name;\n      {\n        if (!/^[a-zA-Z][\\w-]*$/.test(name)) {\n          warn(\n            'Invalid component name: \"' + name + '\". Component names ' +\n            'can only contain alphanumeric characters and the hyphen, ' +\n            'and must start with a letter.'\n          );\n        }\n      }\n\n      var Sub = function VueComponent (options) {\n        this._init(options);\n      };\n      Sub.prototype = Object.create(Super.prototype);\n      Sub.prototype.constructor = Sub;\n      Sub.cid = cid++;\n      Sub.options = mergeOptions(\n        Super.options,\n        extendOptions\n      );\n      Sub['super'] = Super;\n\n      // For props and computed properties, we define the proxy getters on\n      // the Vue instances at extension time, on the extended prototype. This\n      // avoids Object.defineProperty calls for each instance created.\n      if (Sub.options.props) {\n        initProps$1(Sub);\n      }\n      if (Sub.options.computed) {\n        initComputed$1(Sub);\n      }\n\n      // allow further extension/mixin/plugin usage\n      Sub.extend = Super.extend;\n      Sub.mixin = Super.mixin;\n      Sub.use = Super.use;\n\n      // create asset registers, so extended classes\n      // can have their private assets too.\n      config._assetTypes.forEach(function (type) {\n        Sub[type] = Super[type];\n      });\n      // enable recursive self-lookup\n      if (name) {\n        Sub.options.components[name] = Sub;\n      }\n\n      // keep a reference to the super options at extension time.\n      // later at instantiation we can check if Super's options have\n      // been updated.\n      Sub.superOptions = Super.options;\n      Sub.extendOptions = extendOptions;\n      Sub.sealedOptions = extend({}, Sub.options);\n\n      // cache constructor\n      cachedCtors[SuperId] = Sub;\n      return Sub\n    };\n  }\n\n  function initProps$1 (Comp) {\n    var props = Comp.options.props;\n    for (var key in props) {\n      proxy(Comp.prototype, \"_props\", key);\n    }\n  }\n\n  function initComputed$1 (Comp) {\n    var computed = Comp.options.computed;\n    for (var key in computed) {\n      defineComputed(Comp.prototype, key, computed[key]);\n    }\n  }\n\n  /*  */\n\n  function initAssetRegisters (Vue) {\n    /**\n     * Create asset registration methods.\n     */\n    config._assetTypes.forEach(function (type) {\n      Vue[type] = function (\n        id,\n        definition\n      ) {\n        if (!definition) {\n          return this.options[type + 's'][id]\n        } else {\n          /* istanbul ignore if */\n          {\n            if (type === 'component' && config.isReservedTag(id)) {\n              warn(\n                'Do not use built-in or reserved HTML elements as component ' +\n                'id: ' + id\n              );\n            }\n          }\n          if (type === 'component' && isPlainObject(definition)) {\n            definition.name = definition.name || id;\n            definition = this.options._base.extend(definition);\n          }\n          if (type === 'directive' && typeof definition === 'function') {\n            definition = { bind: definition, update: definition };\n          }\n          this.options[type + 's'][id] = definition;\n          return definition\n        }\n      };\n    });\n  }\n\n  /*  */\n\n  var patternTypes = [String, RegExp];\n\n  function getComponentName (opts) {\n    return opts && (opts.Ctor.options.name || opts.tag)\n  }\n\n  function matches (pattern, name) {\n    if (typeof pattern === 'string') {\n      return pattern.split(',').indexOf(name) > -1\n    } else if (pattern instanceof RegExp) {\n      return pattern.test(name)\n    }\n    /* istanbul ignore next */\n    return false\n  }\n\n  function pruneCache (cache, filter) {\n    for (var key in cache) {\n      var cachedNode = cache[key];\n      if (cachedNode) {\n        var name = getComponentName(cachedNode.componentOptions);\n        if (name && !filter(name)) {\n          pruneCacheEntry(cachedNode);\n          cache[key] = null;\n        }\n      }\n    }\n  }\n\n  function pruneCacheEntry (vnode) {\n    if (vnode) {\n      if (!vnode.componentInstance._inactive) {\n        callHook(vnode.componentInstance, 'deactivated');\n      }\n      vnode.componentInstance.$destroy();\n    }\n  }\n\n  var KeepAlive = {\n    name: 'keep-alive',\n    abstract: true,\n\n    props: {\n      include: patternTypes,\n      exclude: patternTypes\n    },\n\n    created: function created () {\n      this.cache = Object.create(null);\n    },\n\n    destroyed: function destroyed () {\n      var this$1 = this;\n\n      for (var key in this$1.cache) {\n        pruneCacheEntry(this$1.cache[key]);\n      }\n    },\n\n    watch: {\n      include: function include (val) {\n        pruneCache(this.cache, function (name) { return matches(val, name); });\n      },\n      exclude: function exclude (val) {\n        pruneCache(this.cache, function (name) { return !matches(val, name); });\n      }\n    },\n\n    render: function render () {\n      var vnode = getFirstComponentChild(this.$slots.default);\n      var componentOptions = vnode && vnode.componentOptions;\n      if (componentOptions) {\n        // check pattern\n        var name = getComponentName(componentOptions);\n        if (name && (\n            (this.include && !matches(this.include, name)) ||\n            (this.exclude && matches(this.exclude, name))\n          )) {\n          return vnode\n        }\n        var key = vnode.key == null\n          // same constructor may get registered as different local components\n          // so cid alone is not enough (#3269)\n          ? componentOptions.Ctor.cid + (componentOptions.tag ? (\"::\" + (componentOptions.tag)) : '')\n          : vnode.key;\n        if (this.cache[key]) {\n          vnode.componentInstance = this.cache[key].componentInstance;\n        } else {\n          this.cache[key] = vnode;\n        }\n        vnode.data.keepAlive = true;\n      }\n      return vnode\n    }\n  };\n\n  var builtInComponents = {\n    KeepAlive: KeepAlive\n  };\n\n  /*  */\n\n  function initGlobalAPI (Vue) {\n    // config\n    var configDef = {};\n    configDef.get = function () { return config; };\n    {\n      configDef.set = function () {\n        warn(\n          'Do not replace the Vue.config object, set individual fields instead.'\n        );\n      };\n    }\n    Object.defineProperty(Vue, 'config', configDef);\n\n    // exposed util methods.\n    // NOTE: these are not considered part of the public API - avoid relying on\n    // them unless you are aware of the risk.\n    Vue.util = {\n      warn: warn,\n      extend: extend,\n      mergeOptions: mergeOptions,\n      defineReactive: defineReactive$$1\n    };\n\n    Vue.set = set;\n    Vue.delete = del;\n    Vue.nextTick = nextTick;\n\n    Vue.options = Object.create(null);\n    config._assetTypes.forEach(function (type) {\n      Vue.options[type + 's'] = Object.create(null);\n    });\n\n    // this is used to identify the \"base\" constructor to extend all plain-object\n    // components with in Weex's multi-instance scenarios.\n    Vue.options._base = Vue;\n\n    extend(Vue.options.components, builtInComponents);\n\n    initUse(Vue);\n    initMixin$1(Vue);\n    initExtend(Vue);\n    initAssetRegisters(Vue);\n  }\n\n  initGlobalAPI(Vue$3);\n\n  Object.defineProperty(Vue$3.prototype, '$isServer', {\n    get: isServerRendering\n  });\n\n  Vue$3.version = '2.2.3';\n\n  /*  */\n\n// attributes that should be using props for binding\n  var acceptValue = makeMap('input,textarea,option,select');\n  var mustUseProp = function (tag, type, attr) {\n    return (\n      (attr === 'value' && acceptValue(tag)) && type !== 'button' ||\n      (attr === 'selected' && tag === 'option') ||\n      (attr === 'checked' && tag === 'input') ||\n      (attr === 'muted' && tag === 'video')\n    )\n  };\n\n  var isEnumeratedAttr = makeMap('contenteditable,draggable,spellcheck');\n\n  var isBooleanAttr = makeMap(\n    'allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,' +\n    'default,defaultchecked,defaultmuted,defaultselected,defer,disabled,' +\n    'enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,' +\n    'muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,' +\n    'required,reversed,scoped,seamless,selected,sortable,translate,' +\n    'truespeed,typemustmatch,visible'\n  );\n\n  var xlinkNS = 'http://www.w3.org/1999/xlink';\n\n  var isXlink = function (name) {\n    return name.charAt(5) === ':' && name.slice(0, 5) === 'xlink'\n  };\n\n  var getXlinkProp = function (name) {\n    return isXlink(name) ? name.slice(6, name.length) : ''\n  };\n\n  var isFalsyAttrValue = function (val) {\n    return val == null || val === false\n  };\n\n  /*  */\n\n  function genClassForVnode (vnode) {\n    var data = vnode.data;\n    var parentNode = vnode;\n    var childNode = vnode;\n    while (childNode.componentInstance) {\n      childNode = childNode.componentInstance._vnode;\n      if (childNode.data) {\n        data = mergeClassData(childNode.data, data);\n      }\n    }\n    while ((parentNode = parentNode.parent)) {\n      if (parentNode.data) {\n        data = mergeClassData(data, parentNode.data);\n      }\n    }\n    return genClassFromData(data)\n  }\n\n  function mergeClassData (child, parent) {\n    return {\n      staticClass: concat(child.staticClass, parent.staticClass),\n      class: child.class\n        ? [child.class, parent.class]\n        : parent.class\n    }\n  }\n\n  function genClassFromData (data) {\n    var dynamicClass = data.class;\n    var staticClass = data.staticClass;\n    if (staticClass || dynamicClass) {\n      return concat(staticClass, stringifyClass(dynamicClass))\n    }\n    /* istanbul ignore next */\n    return ''\n  }\n\n  function concat (a, b) {\n    return a ? b ? (a + ' ' + b) : a : (b || '')\n  }\n\n  function stringifyClass (value) {\n    var res = '';\n    if (!value) {\n      return res\n    }\n    if (typeof value === 'string') {\n      return value\n    }\n    if (Array.isArray(value)) {\n      var stringified;\n      for (var i = 0, l = value.length; i < l; i++) {\n        if (value[i]) {\n          if ((stringified = stringifyClass(value[i]))) {\n            res += stringified + ' ';\n          }\n        }\n      }\n      return res.slice(0, -1)\n    }\n    if (isObject(value)) {\n      for (var key in value) {\n        if (value[key]) { res += key + ' '; }\n      }\n      return res.slice(0, -1)\n    }\n    /* istanbul ignore next */\n    return res\n  }\n\n  /*  */\n\n  var namespaceMap = {\n    svg: 'http://www.w3.org/2000/svg',\n    math: 'http://www.w3.org/1998/Math/MathML'\n  };\n\n  var isHTMLTag = makeMap(\n    'html,body,base,head,link,meta,style,title,' +\n    'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' +\n    'div,dd,dl,dt,figcaption,figure,hr,img,li,main,ol,p,pre,ul,' +\n    'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' +\n    's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' +\n    'embed,object,param,source,canvas,script,noscript,del,ins,' +\n    'caption,col,colgroup,table,thead,tbody,td,th,tr,' +\n    'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' +\n    'output,progress,select,textarea,' +\n    'details,dialog,menu,menuitem,summary,' +\n    'content,element,shadow,template'\n  );\n\n// this map is intentionally selective, only covering SVG elements that may\n// contain child elements.\n  var isSVG = makeMap(\n    'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,' +\n    'foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' +\n    'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view',\n    true\n  );\n\n  var isPreTag = function (tag) { return tag === 'pre'; };\n\n  var isReservedTag = function (tag) {\n    return isHTMLTag(tag) || isSVG(tag)\n  };\n\n  function getTagNamespace (tag) {\n    if (isSVG(tag)) {\n      return 'svg'\n    }\n    // basic support for MathML\n    // note it doesn't support other MathML elements being component roots\n    if (tag === 'math') {\n      return 'math'\n    }\n  }\n\n  var unknownElementCache = Object.create(null);\n  function isUnknownElement (tag) {\n    /* istanbul ignore if */\n    if (!inBrowser) {\n      return true\n    }\n    if (isReservedTag(tag)) {\n      return false\n    }\n    tag = tag.toLowerCase();\n    /* istanbul ignore if */\n    if (unknownElementCache[tag] != null) {\n      return unknownElementCache[tag]\n    }\n    var el = document.createElement(tag);\n    if (tag.indexOf('-') > -1) {\n      // http://stackoverflow.com/a/28210364/1070244\n      return (unknownElementCache[tag] = (\n        el.constructor === window.HTMLUnknownElement ||\n        el.constructor === window.HTMLElement\n      ))\n    } else {\n      return (unknownElementCache[tag] = /HTMLUnknownElement/.test(el.toString()))\n    }\n  }\n\n  /*  */\n\n  /**\n   * Query an element selector if it's not an element already.\n   */\n  function query (el) {\n    if (typeof el === 'string') {\n      var selected = document.querySelector(el);\n      if (!selected) {\n        \"development\" !== 'production' && warn(\n          'Cannot find element: ' + el\n        );\n        return document.createElement('div')\n      }\n      return selected\n    } else {\n      return el\n    }\n  }\n\n  /*  */\n\n  function createElement$1 (tagName, vnode) {\n    var elm = document.createElement(tagName);\n    if (tagName !== 'select') {\n      return elm\n    }\n    // false or null will remove the attribute but undefined will not\n    if (vnode.data && vnode.data.attrs && vnode.data.attrs.multiple !== undefined) {\n      elm.setAttribute('multiple', 'multiple');\n    }\n    return elm\n  }\n\n  function createElementNS (namespace, tagName) {\n    return document.createElementNS(namespaceMap[namespace], tagName)\n  }\n\n  function createTextNode (text) {\n    return document.createTextNode(text)\n  }\n\n  function createComment (text) {\n    return document.createComment(text)\n  }\n\n  function insertBefore (parentNode, newNode, referenceNode) {\n    parentNode.insertBefore(newNode, referenceNode);\n  }\n\n  function removeChild (node, child) {\n    node.removeChild(child);\n  }\n\n  function appendChild (node, child) {\n    node.appendChild(child);\n  }\n\n  function parentNode (node) {\n    return node.parentNode\n  }\n\n  function nextSibling (node) {\n    return node.nextSibling\n  }\n\n  function tagName (node) {\n    return node.tagName\n  }\n\n  function setTextContent (node, text) {\n    node.textContent = text;\n  }\n\n  function setAttribute (node, key, val) {\n    node.setAttribute(key, val);\n  }\n\n\n  var nodeOps = Object.freeze({\n    createElement: createElement$1,\n    createElementNS: createElementNS,\n    createTextNode: createTextNode,\n    createComment: createComment,\n    insertBefore: insertBefore,\n    removeChild: removeChild,\n    appendChild: appendChild,\n    parentNode: parentNode,\n    nextSibling: nextSibling,\n    tagName: tagName,\n    setTextContent: setTextContent,\n    setAttribute: setAttribute\n  });\n\n  /*  */\n\n  var ref = {\n    create: function create (_, vnode) {\n      registerRef(vnode);\n    },\n    update: function update (oldVnode, vnode) {\n      if (oldVnode.data.ref !== vnode.data.ref) {\n        registerRef(oldVnode, true);\n        registerRef(vnode);\n      }\n    },\n    destroy: function destroy (vnode) {\n      registerRef(vnode, true);\n    }\n  };\n\n  function registerRef (vnode, isRemoval) {\n    var key = vnode.data.ref;\n    if (!key) { return }\n\n    var vm = vnode.context;\n    var ref = vnode.componentInstance || vnode.elm;\n    var refs = vm.$refs;\n    if (isRemoval) {\n      if (Array.isArray(refs[key])) {\n        remove(refs[key], ref);\n      } else if (refs[key] === ref) {\n        refs[key] = undefined;\n      }\n    } else {\n      if (vnode.data.refInFor) {\n        if (Array.isArray(refs[key]) && refs[key].indexOf(ref) < 0) {\n          refs[key].push(ref);\n        } else {\n          refs[key] = [ref];\n        }\n      } else {\n        refs[key] = ref;\n      }\n    }\n  }\n\n  /**\n   * Virtual DOM patching algorithm based on Snabbdom by\n   * Simon Friis Vindum (@paldepind)\n   * Licensed under the MIT License\n   * https://github.com/paldepind/snabbdom/blob/master/LICENSE\n   *\n   * modified by Evan You (@yyx990803)\n   *\n\n   /*\n   * Not type-checking this because this file is perf-critical and the cost\n   * of making flow understand it is not worth it.\n   */\n\n  var emptyNode = new VNode('', {}, []);\n\n  var hooks = ['create', 'activate', 'update', 'remove', 'destroy'];\n\n  function isUndef (s) {\n    return s == null\n  }\n\n  function isDef (s) {\n    return s != null\n  }\n\n  function sameVnode (vnode1, vnode2) {\n    return (\n      vnode1.key === vnode2.key &&\n      vnode1.tag === vnode2.tag &&\n      vnode1.isComment === vnode2.isComment &&\n      !vnode1.data === !vnode2.data\n    )\n  }\n\n  function createKeyToOldIdx (children, beginIdx, endIdx) {\n    var i, key;\n    var map = {};\n    for (i = beginIdx; i <= endIdx; ++i) {\n      key = children[i].key;\n      if (isDef(key)) { map[key] = i; }\n    }\n    return map\n  }\n\n  function createPatchFunction (backend) {\n    var i, j;\n    var cbs = {};\n\n    var modules = backend.modules;\n    var nodeOps = backend.nodeOps;\n\n    for (i = 0; i < hooks.length; ++i) {\n      cbs[hooks[i]] = [];\n      for (j = 0; j < modules.length; ++j) {\n        if (modules[j][hooks[i]] !== undefined) { cbs[hooks[i]].push(modules[j][hooks[i]]); }\n      }\n    }\n\n    function emptyNodeAt (elm) {\n      return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm)\n    }\n\n    function createRmCb (childElm, listeners) {\n      function remove$$1 () {\n        if (--remove$$1.listeners === 0) {\n          removeNode(childElm);\n        }\n      }\n      remove$$1.listeners = listeners;\n      return remove$$1\n    }\n\n    function removeNode (el) {\n      var parent = nodeOps.parentNode(el);\n      // element may have already been removed due to v-html / v-text\n      if (parent) {\n        nodeOps.removeChild(parent, el);\n      }\n    }\n\n    var inPre = 0;\n    function createElm (vnode, insertedVnodeQueue, parentElm, refElm, nested) {\n      vnode.isRootInsert = !nested; // for transition enter check\n      if (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) {\n        return\n      }\n\n      var data = vnode.data;\n      var children = vnode.children;\n      var tag = vnode.tag;\n      if (isDef(tag)) {\n        {\n          if (data && data.pre) {\n            inPre++;\n          }\n          if (\n            !inPre &&\n            !vnode.ns &&\n            !(config.ignoredElements.length && config.ignoredElements.indexOf(tag) > -1) &&\n            config.isUnknownElement(tag)\n          ) {\n            warn(\n              'Unknown custom element: <' + tag + '> - did you ' +\n              'register the component correctly? For recursive components, ' +\n              'make sure to provide the \"name\" option.',\n              vnode.context\n            );\n          }\n        }\n        vnode.elm = vnode.ns\n          ? nodeOps.createElementNS(vnode.ns, tag)\n          : nodeOps.createElement(tag, vnode);\n        setScope(vnode);\n\n        /* istanbul ignore if */\n        {\n          createChildren(vnode, children, insertedVnodeQueue);\n          if (isDef(data)) {\n            invokeCreateHooks(vnode, insertedVnodeQueue);\n          }\n          insert(parentElm, vnode.elm, refElm);\n        }\n\n        if (\"development\" !== 'production' && data && data.pre) {\n          inPre--;\n        }\n      } else if (vnode.isComment) {\n        vnode.elm = nodeOps.createComment(vnode.text);\n        insert(parentElm, vnode.elm, refElm);\n      } else {\n        vnode.elm = nodeOps.createTextNode(vnode.text);\n        insert(parentElm, vnode.elm, refElm);\n      }\n    }\n\n    function createComponent (vnode, insertedVnodeQueue, parentElm, refElm) {\n      var i = vnode.data;\n      if (isDef(i)) {\n        var isReactivated = isDef(vnode.componentInstance) && i.keepAlive;\n        if (isDef(i = i.hook) && isDef(i = i.init)) {\n          i(vnode, false /* hydrating */, parentElm, refElm);\n        }\n        // after calling the init hook, if the vnode is a child component\n        // it should've created a child instance and mounted it. the child\n        // component also has set the placeholder vnode's elm.\n        // in that case we can just return the element and be done.\n        if (isDef(vnode.componentInstance)) {\n          initComponent(vnode, insertedVnodeQueue);\n          if (isReactivated) {\n            reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm);\n          }\n          return true\n        }\n      }\n    }\n\n    function initComponent (vnode, insertedVnodeQueue) {\n      if (vnode.data.pendingInsert) {\n        insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert);\n      }\n      vnode.elm = vnode.componentInstance.$el;\n      if (isPatchable(vnode)) {\n        invokeCreateHooks(vnode, insertedVnodeQueue);\n        setScope(vnode);\n      } else {\n        // empty component root.\n        // skip all element-related modules except for ref (#3455)\n        registerRef(vnode);\n        // make sure to invoke the insert hook\n        insertedVnodeQueue.push(vnode);\n      }\n    }\n\n    function reactivateComponent (vnode, insertedVnodeQueue, parentElm, refElm) {\n      var i;\n      // hack for #4339: a reactivated component with inner transition\n      // does not trigger because the inner node's created hooks are not called\n      // again. It's not ideal to involve module-specific logic in here but\n      // there doesn't seem to be a better way to do it.\n      var innerNode = vnode;\n      while (innerNode.componentInstance) {\n        innerNode = innerNode.componentInstance._vnode;\n        if (isDef(i = innerNode.data) && isDef(i = i.transition)) {\n          for (i = 0; i < cbs.activate.length; ++i) {\n            cbs.activate[i](emptyNode, innerNode);\n          }\n          insertedVnodeQueue.push(innerNode);\n          break\n        }\n      }\n      // unlike a newly created component,\n      // a reactivated keep-alive component doesn't insert itself\n      insert(parentElm, vnode.elm, refElm);\n    }\n\n    function insert (parent, elm, ref) {\n      if (parent) {\n        if (ref) {\n          nodeOps.insertBefore(parent, elm, ref);\n        } else {\n          nodeOps.appendChild(parent, elm);\n        }\n      }\n    }\n\n    function createChildren (vnode, children, insertedVnodeQueue) {\n      if (Array.isArray(children)) {\n        for (var i = 0; i < children.length; ++i) {\n          createElm(children[i], insertedVnodeQueue, vnode.elm, null, true);\n        }\n      } else if (isPrimitive(vnode.text)) {\n        nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(vnode.text));\n      }\n    }\n\n    function isPatchable (vnode) {\n      while (vnode.componentInstance) {\n        vnode = vnode.componentInstance._vnode;\n      }\n      return isDef(vnode.tag)\n    }\n\n    function invokeCreateHooks (vnode, insertedVnodeQueue) {\n      for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {\n        cbs.create[i$1](emptyNode, vnode);\n      }\n      i = vnode.data.hook; // Reuse variable\n      if (isDef(i)) {\n        if (i.create) { i.create(emptyNode, vnode); }\n        if (i.insert) { insertedVnodeQueue.push(vnode); }\n      }\n    }\n\n    // set scope id attribute for scoped CSS.\n    // this is implemented as a special case to avoid the overhead\n    // of going through the normal attribute patching process.\n    function setScope (vnode) {\n      var i;\n      var ancestor = vnode;\n      while (ancestor) {\n        if (isDef(i = ancestor.context) && isDef(i = i.$options._scopeId)) {\n          nodeOps.setAttribute(vnode.elm, i, '');\n        }\n        ancestor = ancestor.parent;\n      }\n      // for slot content they should also get the scopeId from the host instance.\n      if (isDef(i = activeInstance) &&\n        i !== vnode.context &&\n        isDef(i = i.$options._scopeId)) {\n        nodeOps.setAttribute(vnode.elm, i, '');\n      }\n    }\n\n    function addVnodes (parentElm, refElm, vnodes, startIdx, endIdx, insertedVnodeQueue) {\n      for (; startIdx <= endIdx; ++startIdx) {\n        createElm(vnodes[startIdx], insertedVnodeQueue, parentElm, refElm);\n      }\n    }\n\n    function invokeDestroyHook (vnode) {\n      var i, j;\n      var data = vnode.data;\n      if (isDef(data)) {\n        if (isDef(i = data.hook) && isDef(i = i.destroy)) { i(vnode); }\n        for (i = 0; i < cbs.destroy.length; ++i) { cbs.destroy[i](vnode); }\n      }\n      if (isDef(i = vnode.children)) {\n        for (j = 0; j < vnode.children.length; ++j) {\n          invokeDestroyHook(vnode.children[j]);\n        }\n      }\n    }\n\n    function removeVnodes (parentElm, vnodes, startIdx, endIdx) {\n      for (; startIdx <= endIdx; ++startIdx) {\n        var ch = vnodes[startIdx];\n        if (isDef(ch)) {\n          if (isDef(ch.tag)) {\n            removeAndInvokeRemoveHook(ch);\n            invokeDestroyHook(ch);\n          } else { // Text node\n            removeNode(ch.elm);\n          }\n        }\n      }\n    }\n\n    function removeAndInvokeRemoveHook (vnode, rm) {\n      if (rm || isDef(vnode.data)) {\n        var listeners = cbs.remove.length + 1;\n        if (!rm) {\n          // directly removing\n          rm = createRmCb(vnode.elm, listeners);\n        } else {\n          // we have a recursively passed down rm callback\n          // increase the listeners count\n          rm.listeners += listeners;\n        }\n        // recursively invoke hooks on child component root node\n        if (isDef(i = vnode.componentInstance) && isDef(i = i._vnode) && isDef(i.data)) {\n          removeAndInvokeRemoveHook(i, rm);\n        }\n        for (i = 0; i < cbs.remove.length; ++i) {\n          cbs.remove[i](vnode, rm);\n        }\n        if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) {\n          i(vnode, rm);\n        } else {\n          rm();\n        }\n      } else {\n        removeNode(vnode.elm);\n      }\n    }\n\n    function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {\n      var oldStartIdx = 0;\n      var newStartIdx = 0;\n      var oldEndIdx = oldCh.length - 1;\n      var oldStartVnode = oldCh[0];\n      var oldEndVnode = oldCh[oldEndIdx];\n      var newEndIdx = newCh.length - 1;\n      var newStartVnode = newCh[0];\n      var newEndVnode = newCh[newEndIdx];\n      var oldKeyToIdx, idxInOld, elmToMove, refElm;\n\n      // removeOnly is a special flag used only by <transition-group>\n      // to ensure removed elements stay in correct relative positions\n      // during leaving transitions\n      var canMove = !removeOnly;\n\n      while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {\n        if (isUndef(oldStartVnode)) {\n          oldStartVnode = oldCh[++oldStartIdx]; // Vnode has been moved left\n        } else if (isUndef(oldEndVnode)) {\n          oldEndVnode = oldCh[--oldEndIdx];\n        } else if (sameVnode(oldStartVnode, newStartVnode)) {\n          patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);\n          oldStartVnode = oldCh[++oldStartIdx];\n          newStartVnode = newCh[++newStartIdx];\n        } else if (sameVnode(oldEndVnode, newEndVnode)) {\n          patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);\n          oldEndVnode = oldCh[--oldEndIdx];\n          newEndVnode = newCh[--newEndIdx];\n        } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right\n          patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);\n          canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm));\n          oldStartVnode = oldCh[++oldStartIdx];\n          newEndVnode = newCh[--newEndIdx];\n        } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left\n          patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);\n          canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);\n          oldEndVnode = oldCh[--oldEndIdx];\n          newStartVnode = newCh[++newStartIdx];\n        } else {\n          if (isUndef(oldKeyToIdx)) { oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); }\n          idxInOld = isDef(newStartVnode.key) ? oldKeyToIdx[newStartVnode.key] : null;\n          if (isUndef(idxInOld)) { // New element\n            createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm);\n            newStartVnode = newCh[++newStartIdx];\n          } else {\n            elmToMove = oldCh[idxInOld];\n            /* istanbul ignore if */\n            if (\"development\" !== 'production' && !elmToMove) {\n              warn(\n                'It seems there are duplicate keys that is causing an update error. ' +\n                'Make sure each v-for item has a unique key.'\n              );\n            }\n            if (sameVnode(elmToMove, newStartVnode)) {\n              patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);\n              oldCh[idxInOld] = undefined;\n              canMove && nodeOps.insertBefore(parentElm, newStartVnode.elm, oldStartVnode.elm);\n              newStartVnode = newCh[++newStartIdx];\n            } else {\n              // same key but different element. treat as new element\n              createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm);\n              newStartVnode = newCh[++newStartIdx];\n            }\n          }\n        }\n      }\n      if (oldStartIdx > oldEndIdx) {\n        refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm;\n        addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);\n      } else if (newStartIdx > newEndIdx) {\n        removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);\n      }\n    }\n\n    function patchVnode (oldVnode, vnode, insertedVnodeQueue, removeOnly) {\n      if (oldVnode === vnode) {\n        return\n      }\n      // reuse element for static trees.\n      // note we only do this if the vnode is cloned -\n      // if the new node is not cloned it means the render functions have been\n      // reset by the hot-reload-api and we need to do a proper re-render.\n      if (vnode.isStatic &&\n        oldVnode.isStatic &&\n        vnode.key === oldVnode.key &&\n        (vnode.isCloned || vnode.isOnce)) {\n        vnode.elm = oldVnode.elm;\n        vnode.componentInstance = oldVnode.componentInstance;\n        return\n      }\n      var i;\n      var data = vnode.data;\n      var hasData = isDef(data);\n      if (hasData && isDef(i = data.hook) && isDef(i = i.prepatch)) {\n        i(oldVnode, vnode);\n      }\n      var elm = vnode.elm = oldVnode.elm;\n      var oldCh = oldVnode.children;\n      var ch = vnode.children;\n      if (hasData && isPatchable(vnode)) {\n        for (i = 0; i < cbs.update.length; ++i) { cbs.update[i](oldVnode, vnode); }\n        if (isDef(i = data.hook) && isDef(i = i.update)) { i(oldVnode, vnode); }\n      }\n      if (isUndef(vnode.text)) {\n        if (isDef(oldCh) && isDef(ch)) {\n          if (oldCh !== ch) { updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly); }\n        } else if (isDef(ch)) {\n          if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); }\n          addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);\n        } else if (isDef(oldCh)) {\n          removeVnodes(elm, oldCh, 0, oldCh.length - 1);\n        } else if (isDef(oldVnode.text)) {\n          nodeOps.setTextContent(elm, '');\n        }\n      } else if (oldVnode.text !== vnode.text) {\n        nodeOps.setTextContent(elm, vnode.text);\n      }\n      if (hasData) {\n        if (isDef(i = data.hook) && isDef(i = i.postpatch)) { i(oldVnode, vnode); }\n      }\n    }\n\n    function invokeInsertHook (vnode, queue, initial) {\n      // delay insert hooks for component root nodes, invoke them after the\n      // element is really inserted\n      if (initial && vnode.parent) {\n        vnode.parent.data.pendingInsert = queue;\n      } else {\n        for (var i = 0; i < queue.length; ++i) {\n          queue[i].data.hook.insert(queue[i]);\n        }\n      }\n    }\n\n    var bailed = false;\n    // list of modules that can skip create hook during hydration because they\n    // are already rendered on the client or has no need for initialization\n    var isRenderedModule = makeMap('attrs,style,class,staticClass,staticStyle,key');\n\n    // Note: this is a browser-only function so we can assume elms are DOM nodes.\n    function hydrate (elm, vnode, insertedVnodeQueue) {\n      {\n        if (!assertNodeMatch(elm, vnode)) {\n          return false\n        }\n      }\n      vnode.elm = elm;\n      var tag = vnode.tag;\n      var data = vnode.data;\n      var children = vnode.children;\n      if (isDef(data)) {\n        if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode, true /* hydrating */); }\n        if (isDef(i = vnode.componentInstance)) {\n          // child component. it should have hydrated its own tree.\n          initComponent(vnode, insertedVnodeQueue);\n          return true\n        }\n      }\n      if (isDef(tag)) {\n        if (isDef(children)) {\n          // empty element, allow client to pick up and populate children\n          if (!elm.hasChildNodes()) {\n            createChildren(vnode, children, insertedVnodeQueue);\n          } else {\n            var childrenMatch = true;\n            var childNode = elm.firstChild;\n            for (var i$1 = 0; i$1 < children.length; i$1++) {\n              if (!childNode || !hydrate(childNode, children[i$1], insertedVnodeQueue)) {\n                childrenMatch = false;\n                break\n              }\n              childNode = childNode.nextSibling;\n            }\n            // if childNode is not null, it means the actual childNodes list is\n            // longer than the virtual children list.\n            if (!childrenMatch || childNode) {\n              if (\"development\" !== 'production' &&\n                typeof console !== 'undefined' &&\n                !bailed) {\n                bailed = true;\n                console.warn('Parent: ', elm);\n                console.warn('Mismatching childNodes vs. VNodes: ', elm.childNodes, children);\n              }\n              return false\n            }\n          }\n        }\n        if (isDef(data)) {\n          for (var key in data) {\n            if (!isRenderedModule(key)) {\n              invokeCreateHooks(vnode, insertedVnodeQueue);\n              break\n            }\n          }\n        }\n      } else if (elm.data !== vnode.text) {\n        elm.data = vnode.text;\n      }\n      return true\n    }\n\n    function assertNodeMatch (node, vnode) {\n      if (vnode.tag) {\n        return (\n          vnode.tag.indexOf('vue-component') === 0 ||\n          vnode.tag.toLowerCase() === (node.tagName && node.tagName.toLowerCase())\n        )\n      } else {\n        return node.nodeType === (vnode.isComment ? 8 : 3)\n      }\n    }\n\n    return function patch (oldVnode, vnode, hydrating, removeOnly, parentElm, refElm) {\n      if (!vnode) {\n        if (oldVnode) { invokeDestroyHook(oldVnode); }\n        return\n      }\n\n      var isInitialPatch = false;\n      var insertedVnodeQueue = [];\n\n      if (!oldVnode) {\n        // empty mount (likely as component), create new root element\n        isInitialPatch = true;\n        createElm(vnode, insertedVnodeQueue, parentElm, refElm);\n      } else {\n        var isRealElement = isDef(oldVnode.nodeType);\n        if (!isRealElement && sameVnode(oldVnode, vnode)) {\n          // patch existing root node\n          patchVnode(oldVnode, vnode, insertedVnodeQueue, removeOnly);\n        } else {\n          if (isRealElement) {\n            // mounting to a real element\n            // check if this is server-rendered content and if we can perform\n            // a successful hydration.\n            if (oldVnode.nodeType === 1 && oldVnode.hasAttribute('server-rendered')) {\n              oldVnode.removeAttribute('server-rendered');\n              hydrating = true;\n            }\n            if (hydrating) {\n              if (hydrate(oldVnode, vnode, insertedVnodeQueue)) {\n                invokeInsertHook(vnode, insertedVnodeQueue, true);\n                return oldVnode\n              } else {\n                warn(\n                  'The client-side rendered virtual DOM tree is not matching ' +\n                  'server-rendered content. This is likely caused by incorrect ' +\n                  'HTML markup, for example nesting block-level elements inside ' +\n                  '<p>, or missing <tbody>. Bailing hydration and performing ' +\n                  'full client-side render.'\n                );\n              }\n            }\n            // either not server-rendered, or hydration failed.\n            // create an empty node and replace it\n            oldVnode = emptyNodeAt(oldVnode);\n          }\n          // replacing existing element\n          var oldElm = oldVnode.elm;\n          var parentElm$1 = nodeOps.parentNode(oldElm);\n          createElm(\n            vnode,\n            insertedVnodeQueue,\n            // extremely rare edge case: do not insert if old element is in a\n            // leaving transition. Only happens when combining transition +\n            // keep-alive + HOCs. (#4590)\n            oldElm._leaveCb ? null : parentElm$1,\n            nodeOps.nextSibling(oldElm)\n          );\n\n          if (vnode.parent) {\n            // component root element replaced.\n            // update parent placeholder node element, recursively\n            var ancestor = vnode.parent;\n            while (ancestor) {\n              ancestor.elm = vnode.elm;\n              ancestor = ancestor.parent;\n            }\n            if (isPatchable(vnode)) {\n              for (var i = 0; i < cbs.create.length; ++i) {\n                cbs.create[i](emptyNode, vnode.parent);\n              }\n            }\n          }\n\n          if (parentElm$1 !== null) {\n            removeVnodes(parentElm$1, [oldVnode], 0, 0);\n          } else if (isDef(oldVnode.tag)) {\n            invokeDestroyHook(oldVnode);\n          }\n        }\n      }\n\n      invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch);\n      return vnode.elm\n    }\n  }\n\n  /*  */\n\n  var directives = {\n    create: updateDirectives,\n    update: updateDirectives,\n    destroy: function unbindDirectives (vnode) {\n      updateDirectives(vnode, emptyNode);\n    }\n  };\n\n  function updateDirectives (oldVnode, vnode) {\n    if (oldVnode.data.directives || vnode.data.directives) {\n      _update(oldVnode, vnode);\n    }\n  }\n\n  function _update (oldVnode, vnode) {\n    var isCreate = oldVnode === emptyNode;\n    var isDestroy = vnode === emptyNode;\n    var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);\n    var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);\n\n    var dirsWithInsert = [];\n    var dirsWithPostpatch = [];\n\n    var key, oldDir, dir;\n    for (key in newDirs) {\n      oldDir = oldDirs[key];\n      dir = newDirs[key];\n      if (!oldDir) {\n        // new directive, bind\n        callHook$1(dir, 'bind', vnode, oldVnode);\n        if (dir.def && dir.def.inserted) {\n          dirsWithInsert.push(dir);\n        }\n      } else {\n        // existing directive, update\n        dir.oldValue = oldDir.value;\n        callHook$1(dir, 'update', vnode, oldVnode);\n        if (dir.def && dir.def.componentUpdated) {\n          dirsWithPostpatch.push(dir);\n        }\n      }\n    }\n\n    if (dirsWithInsert.length) {\n      var callInsert = function () {\n        for (var i = 0; i < dirsWithInsert.length; i++) {\n          callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode);\n        }\n      };\n      if (isCreate) {\n        mergeVNodeHook(vnode.data.hook || (vnode.data.hook = {}), 'insert', callInsert);\n      } else {\n        callInsert();\n      }\n    }\n\n    if (dirsWithPostpatch.length) {\n      mergeVNodeHook(vnode.data.hook || (vnode.data.hook = {}), 'postpatch', function () {\n        for (var i = 0; i < dirsWithPostpatch.length; i++) {\n          callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode);\n        }\n      });\n    }\n\n    if (!isCreate) {\n      for (key in oldDirs) {\n        if (!newDirs[key]) {\n          // no longer present, unbind\n          callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy);\n        }\n      }\n    }\n  }\n\n  var emptyModifiers = Object.create(null);\n\n  function normalizeDirectives$1 (\n    dirs,\n    vm\n  ) {\n    var res = Object.create(null);\n    if (!dirs) {\n      return res\n    }\n    var i, dir;\n    for (i = 0; i < dirs.length; i++) {\n      dir = dirs[i];\n      if (!dir.modifiers) {\n        dir.modifiers = emptyModifiers;\n      }\n      res[getRawDirName(dir)] = dir;\n      dir.def = resolveAsset(vm.$options, 'directives', dir.name, true);\n    }\n    return res\n  }\n\n  function getRawDirName (dir) {\n    return dir.rawName || ((dir.name) + \".\" + (Object.keys(dir.modifiers || {}).join('.')))\n  }\n\n  function callHook$1 (dir, hook, vnode, oldVnode, isDestroy) {\n    var fn = dir.def && dir.def[hook];\n    if (fn) {\n      fn(vnode.elm, dir, vnode, oldVnode, isDestroy);\n    }\n  }\n\n  var baseModules = [\n    ref,\n    directives\n  ];\n\n  /*  */\n\n  function updateAttrs (oldVnode, vnode) {\n    if (!oldVnode.data.attrs && !vnode.data.attrs) {\n      return\n    }\n    var key, cur, old;\n    var elm = vnode.elm;\n    var oldAttrs = oldVnode.data.attrs || {};\n    var attrs = vnode.data.attrs || {};\n    // clone observed objects, as the user probably wants to mutate it\n    if (attrs.__ob__) {\n      attrs = vnode.data.attrs = extend({}, attrs);\n    }\n\n    for (key in attrs) {\n      cur = attrs[key];\n      old = oldAttrs[key];\n      if (old !== cur) {\n        setAttr(elm, key, cur);\n      }\n    }\n    // #4391: in IE9, setting type can reset value for input[type=radio]\n    /* istanbul ignore if */\n    if (isIE9 && attrs.value !== oldAttrs.value) {\n      setAttr(elm, 'value', attrs.value);\n    }\n    for (key in oldAttrs) {\n      if (attrs[key] == null) {\n        if (isXlink(key)) {\n          elm.removeAttributeNS(xlinkNS, getXlinkProp(key));\n        } else if (!isEnumeratedAttr(key)) {\n          elm.removeAttribute(key);\n        }\n      }\n    }\n  }\n\n  function setAttr (el, key, value) {\n    if (isBooleanAttr(key)) {\n      // set attribute for blank value\n      // e.g. <option disabled>Select one</option>\n      if (isFalsyAttrValue(value)) {\n        el.removeAttribute(key);\n      } else {\n        el.setAttribute(key, key);\n      }\n    } else if (isEnumeratedAttr(key)) {\n      el.setAttribute(key, isFalsyAttrValue(value) || value === 'false' ? 'false' : 'true');\n    } else if (isXlink(key)) {\n      if (isFalsyAttrValue(value)) {\n        el.removeAttributeNS(xlinkNS, getXlinkProp(key));\n      } else {\n        el.setAttributeNS(xlinkNS, key, value);\n      }\n    } else {\n      if (isFalsyAttrValue(value)) {\n        el.removeAttribute(key);\n      } else {\n        el.setAttribute(key, value);\n      }\n    }\n  }\n\n  var attrs = {\n    create: updateAttrs,\n    update: updateAttrs\n  };\n\n  /*  */\n\n  function updateClass (oldVnode, vnode) {\n    var el = vnode.elm;\n    var data = vnode.data;\n    var oldData = oldVnode.data;\n    if (!data.staticClass && !data.class &&\n      (!oldData || (!oldData.staticClass && !oldData.class))) {\n      return\n    }\n\n    var cls = genClassForVnode(vnode);\n\n    // handle transition classes\n    var transitionClass = el._transitionClasses;\n    if (transitionClass) {\n      cls = concat(cls, stringifyClass(transitionClass));\n    }\n\n    // set the class\n    if (cls !== el._prevClass) {\n      el.setAttribute('class', cls);\n      el._prevClass = cls;\n    }\n  }\n\n  var klass = {\n    create: updateClass,\n    update: updateClass\n  };\n\n  /*  */\n\n  var validDivisionCharRE = /[\\w).+\\-_$\\]]/;\n\n  function parseFilters (exp) {\n    var inSingle = false;\n    var inDouble = false;\n    var inTemplateString = false;\n    var inRegex = false;\n    var curly = 0;\n    var square = 0;\n    var paren = 0;\n    var lastFilterIndex = 0;\n    var c, prev, i, expression, filters;\n\n    for (i = 0; i < exp.length; i++) {\n      prev = c;\n      c = exp.charCodeAt(i);\n      if (inSingle) {\n        if (c === 0x27 && prev !== 0x5C) { inSingle = false; }\n      } else if (inDouble) {\n        if (c === 0x22 && prev !== 0x5C) { inDouble = false; }\n      } else if (inTemplateString) {\n        if (c === 0x60 && prev !== 0x5C) { inTemplateString = false; }\n      } else if (inRegex) {\n        if (c === 0x2f && prev !== 0x5C) { inRegex = false; }\n      } else if (\n        c === 0x7C && // pipe\n        exp.charCodeAt(i + 1) !== 0x7C &&\n        exp.charCodeAt(i - 1) !== 0x7C &&\n        !curly && !square && !paren\n      ) {\n        if (expression === undefined) {\n          // first filter, end of expression\n          lastFilterIndex = i + 1;\n          expression = exp.slice(0, i).trim();\n        } else {\n          pushFilter();\n        }\n      } else {\n        switch (c) {\n          case 0x22: inDouble = true; break         // \"\n          case 0x27: inSingle = true; break         // '\n          case 0x60: inTemplateString = true; break // `\n          case 0x28: paren++; break                 // (\n          case 0x29: paren--; break                 // )\n          case 0x5B: square++; break                // [\n          case 0x5D: square--; break                // ]\n          case 0x7B: curly++; break                 // {\n          case 0x7D: curly--; break                 // }\n        }\n        if (c === 0x2f) { // /\n          var j = i - 1;\n          var p = (void 0);\n          // find first non-whitespace prev char\n          for (; j >= 0; j--) {\n            p = exp.charAt(j);\n            if (p !== ' ') { break }\n          }\n          if (!p || !validDivisionCharRE.test(p)) {\n            inRegex = true;\n          }\n        }\n      }\n    }\n\n    if (expression === undefined) {\n      expression = exp.slice(0, i).trim();\n    } else if (lastFilterIndex !== 0) {\n      pushFilter();\n    }\n\n    function pushFilter () {\n      (filters || (filters = [])).push(exp.slice(lastFilterIndex, i).trim());\n      lastFilterIndex = i + 1;\n    }\n\n    if (filters) {\n      for (i = 0; i < filters.length; i++) {\n        expression = wrapFilter(expression, filters[i]);\n      }\n    }\n\n    return expression\n  }\n\n  function wrapFilter (exp, filter) {\n    var i = filter.indexOf('(');\n    if (i < 0) {\n      // _f: resolveFilter\n      return (\"_f(\\\"\" + filter + \"\\\")(\" + exp + \")\")\n    } else {\n      var name = filter.slice(0, i);\n      var args = filter.slice(i + 1);\n      return (\"_f(\\\"\" + name + \"\\\")(\" + exp + \",\" + args)\n    }\n  }\n\n  /*  */\n\n  function baseWarn (msg) {\n    console.error((\"[Vue compiler]: \" + msg));\n  }\n\n  function pluckModuleFunction (\n    modules,\n    key\n  ) {\n    return modules\n      ? modules.map(function (m) { return m[key]; }).filter(function (_) { return _; })\n      : []\n  }\n\n  function addProp (el, name, value) {\n    (el.props || (el.props = [])).push({ name: name, value: value });\n  }\n\n  function addAttr (el, name, value) {\n    (el.attrs || (el.attrs = [])).push({ name: name, value: value });\n  }\n\n  function addDirective (\n    el,\n    name,\n    rawName,\n    value,\n    arg,\n    modifiers\n  ) {\n    (el.directives || (el.directives = [])).push({ name: name, rawName: rawName, value: value, arg: arg, modifiers: modifiers });\n  }\n\n  function addHandler (\n    el,\n    name,\n    value,\n    modifiers,\n    important\n  ) {\n    // check capture modifier\n    if (modifiers && modifiers.capture) {\n      delete modifiers.capture;\n      name = '!' + name; // mark the event as captured\n    }\n    if (modifiers && modifiers.once) {\n      delete modifiers.once;\n      name = '~' + name; // mark the event as once\n    }\n    var events;\n    if (modifiers && modifiers.native) {\n      delete modifiers.native;\n      events = el.nativeEvents || (el.nativeEvents = {});\n    } else {\n      events = el.events || (el.events = {});\n    }\n    var newHandler = { value: value, modifiers: modifiers };\n    var handlers = events[name];\n    /* istanbul ignore if */\n    if (Array.isArray(handlers)) {\n      important ? handlers.unshift(newHandler) : handlers.push(newHandler);\n    } else if (handlers) {\n      events[name] = important ? [newHandler, handlers] : [handlers, newHandler];\n    } else {\n      events[name] = newHandler;\n    }\n  }\n\n  function getBindingAttr (\n    el,\n    name,\n    getStatic\n  ) {\n    var dynamicValue =\n      getAndRemoveAttr(el, ':' + name) ||\n      getAndRemoveAttr(el, 'v-bind:' + name);\n    if (dynamicValue != null) {\n      return parseFilters(dynamicValue)\n    } else if (getStatic !== false) {\n      var staticValue = getAndRemoveAttr(el, name);\n      if (staticValue != null) {\n        return JSON.stringify(staticValue)\n      }\n    }\n  }\n\n  function getAndRemoveAttr (el, name) {\n    var val;\n    if ((val = el.attrsMap[name]) != null) {\n      var list = el.attrsList;\n      for (var i = 0, l = list.length; i < l; i++) {\n        if (list[i].name === name) {\n          list.splice(i, 1);\n          break\n        }\n      }\n    }\n    return val\n  }\n\n  /*  */\n\n  /**\n   * Cross-platform code generation for component v-model\n   */\n  function genComponentModel (\n    el,\n    value,\n    modifiers\n  ) {\n    var ref = modifiers || {};\n    var number = ref.number;\n    var trim = ref.trim;\n\n    var baseValueExpression = '$$v';\n    var valueExpression = baseValueExpression;\n    if (trim) {\n      valueExpression =\n        \"(typeof \" + baseValueExpression + \" === 'string'\" +\n        \"? \" + baseValueExpression + \".trim()\" +\n        \": \" + baseValueExpression + \")\";\n    }\n    if (number) {\n      valueExpression = \"_n(\" + valueExpression + \")\";\n    }\n    var assignment = genAssignmentCode(value, valueExpression);\n\n    el.model = {\n      value: (\"(\" + value + \")\"),\n      expression: (\"\\\"\" + value + \"\\\"\"),\n      callback: (\"function (\" + baseValueExpression + \") {\" + assignment + \"}\")\n    };\n  }\n\n  /**\n   * Cross-platform codegen helper for generating v-model value assignment code.\n   */\n  function genAssignmentCode (\n    value,\n    assignment\n  ) {\n    var modelRs = parseModel(value);\n    if (modelRs.idx === null) {\n      return (value + \"=\" + assignment)\n    } else {\n      return \"var $$exp = \" + (modelRs.exp) + \", $$idx = \" + (modelRs.idx) + \";\" +\n        \"if (!Array.isArray($$exp)){\" +\n        value + \"=\" + assignment + \"}\" +\n        \"else{$$exp.splice($$idx, 1, \" + assignment + \")}\"\n    }\n  }\n\n  /**\n   * parse directive model to do the array update transform. a[idx] = val => $$a.splice($$idx, 1, val)\n   *\n   * for loop possible cases:\n   *\n   * - test\n   * - test[idx]\n   * - test[test1[idx]]\n   * - test[\"a\"][idx]\n   * - xxx.test[a[a].test1[idx]]\n   * - test.xxx.a[\"asa\"][test1[idx]]\n   *\n   */\n\n  var len;\n  var str;\n  var chr;\n  var index$1;\n  var expressionPos;\n  var expressionEndPos;\n\n  function parseModel (val) {\n    str = val;\n    len = str.length;\n    index$1 = expressionPos = expressionEndPos = 0;\n\n    if (val.indexOf('[') < 0 || val.lastIndexOf(']') < len - 1) {\n      return {\n        exp: val,\n        idx: null\n      }\n    }\n\n    while (!eof()) {\n      chr = next();\n      /* istanbul ignore if */\n      if (isStringStart(chr)) {\n        parseString(chr);\n      } else if (chr === 0x5B) {\n        parseBracket(chr);\n      }\n    }\n\n    return {\n      exp: val.substring(0, expressionPos),\n      idx: val.substring(expressionPos + 1, expressionEndPos)\n    }\n  }\n\n  function next () {\n    return str.charCodeAt(++index$1)\n  }\n\n  function eof () {\n    return index$1 >= len\n  }\n\n  function isStringStart (chr) {\n    return chr === 0x22 || chr === 0x27\n  }\n\n  function parseBracket (chr) {\n    var inBracket = 1;\n    expressionPos = index$1;\n    while (!eof()) {\n      chr = next();\n      if (isStringStart(chr)) {\n        parseString(chr);\n        continue\n      }\n      if (chr === 0x5B) { inBracket++; }\n      if (chr === 0x5D) { inBracket--; }\n      if (inBracket === 0) {\n        expressionEndPos = index$1;\n        break\n      }\n    }\n  }\n\n  function parseString (chr) {\n    var stringQuote = chr;\n    while (!eof()) {\n      chr = next();\n      if (chr === stringQuote) {\n        break\n      }\n    }\n  }\n\n  /*  */\n\n  var warn$1;\n\n// in some cases, the event used has to be determined at runtime\n// so we used some reserved tokens during compile.\n  var RANGE_TOKEN = '__r';\n  var CHECKBOX_RADIO_TOKEN = '__c';\n\n  function model (\n    el,\n    dir,\n    _warn\n  ) {\n    warn$1 = _warn;\n    var value = dir.value;\n    var modifiers = dir.modifiers;\n    var tag = el.tag;\n    var type = el.attrsMap.type;\n\n    {\n      var dynamicType = el.attrsMap['v-bind:type'] || el.attrsMap[':type'];\n      if (tag === 'input' && dynamicType) {\n        warn$1(\n          \"<input :type=\\\"\" + dynamicType + \"\\\" v-model=\\\"\" + value + \"\\\">:\\n\" +\n          \"v-model does not support dynamic input types. Use v-if branches instead.\"\n        );\n      }\n      // inputs with type=\"file\" are read only and setting the input's\n      // value will throw an error.\n      if (tag === 'input' && type === 'file') {\n        warn$1(\n          \"<\" + (el.tag) + \" v-model=\\\"\" + value + \"\\\" type=\\\"file\\\">:\\n\" +\n          \"File inputs are read only. Use a v-on:change listener instead.\"\n        );\n      }\n    }\n\n    if (tag === 'select') {\n      genSelect(el, value, modifiers);\n    } else if (tag === 'input' && type === 'checkbox') {\n      genCheckboxModel(el, value, modifiers);\n    } else if (tag === 'input' && type === 'radio') {\n      genRadioModel(el, value, modifiers);\n    } else if (tag === 'input' || tag === 'textarea') {\n      genDefaultModel(el, value, modifiers);\n    } else if (!config.isReservedTag(tag)) {\n      genComponentModel(el, value, modifiers);\n      // component v-model doesn't need extra runtime\n      return false\n    } else {\n      warn$1(\n        \"<\" + (el.tag) + \" v-model=\\\"\" + value + \"\\\">: \" +\n        \"v-model is not supported on this element type. \" +\n        'If you are working with contenteditable, it\\'s recommended to ' +\n        'wrap a library dedicated for that purpose inside a custom component.'\n      );\n    }\n\n    // ensure runtime directive metadata\n    return true\n  }\n\n  function genCheckboxModel (\n    el,\n    value,\n    modifiers\n  ) {\n    var number = modifiers && modifiers.number;\n    var valueBinding = getBindingAttr(el, 'value') || 'null';\n    var trueValueBinding = getBindingAttr(el, 'true-value') || 'true';\n    var falseValueBinding = getBindingAttr(el, 'false-value') || 'false';\n    addProp(el, 'checked',\n      \"Array.isArray(\" + value + \")\" +\n      \"?_i(\" + value + \",\" + valueBinding + \")>-1\" + (\n        trueValueBinding === 'true'\n          ? (\":(\" + value + \")\")\n          : (\":_q(\" + value + \",\" + trueValueBinding + \")\")\n      )\n    );\n    addHandler(el, CHECKBOX_RADIO_TOKEN,\n      \"var $$a=\" + value + \",\" +\n      '$$el=$event.target,' +\n      \"$$c=$$el.checked?(\" + trueValueBinding + \"):(\" + falseValueBinding + \");\" +\n      'if(Array.isArray($$a)){' +\n      \"var $$v=\" + (number ? '_n(' + valueBinding + ')' : valueBinding) + \",\" +\n      '$$i=_i($$a,$$v);' +\n      \"if($$c){$$i<0&&(\" + value + \"=$$a.concat($$v))}\" +\n      \"else{$$i>-1&&(\" + value + \"=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}\" +\n      \"}else{\" + value + \"=$$c}\",\n      null, true\n    );\n  }\n\n  function genRadioModel (\n    el,\n    value,\n    modifiers\n  ) {\n    var number = modifiers && modifiers.number;\n    var valueBinding = getBindingAttr(el, 'value') || 'null';\n    valueBinding = number ? (\"_n(\" + valueBinding + \")\") : valueBinding;\n    addProp(el, 'checked', (\"_q(\" + value + \",\" + valueBinding + \")\"));\n    addHandler(el, CHECKBOX_RADIO_TOKEN, genAssignmentCode(value, valueBinding), null, true);\n  }\n\n  function genSelect (\n    el,\n    value,\n    modifiers\n  ) {\n    var number = modifiers && modifiers.number;\n    var selectedVal = \"Array.prototype.filter\" +\n      \".call($event.target.options,function(o){return o.selected})\" +\n      \".map(function(o){var val = \\\"_value\\\" in o ? o._value : o.value;\" +\n      \"return \" + (number ? '_n(val)' : 'val') + \"})\";\n\n    var assignment = '$event.target.multiple ? $$selectedVal : $$selectedVal[0]';\n    var code = \"var $$selectedVal = \" + selectedVal + \";\";\n    code = code + \" \" + (genAssignmentCode(value, assignment));\n    addHandler(el, 'change', code, null, true);\n  }\n\n  function genDefaultModel (\n    el,\n    value,\n    modifiers\n  ) {\n    var type = el.attrsMap.type;\n    var ref = modifiers || {};\n    var lazy = ref.lazy;\n    var number = ref.number;\n    var trim = ref.trim;\n    var needCompositionGuard = !lazy && type !== 'range';\n    var event = lazy\n      ? 'change'\n      : type === 'range'\n        ? RANGE_TOKEN\n        : 'input';\n\n    var valueExpression = '$event.target.value';\n    if (trim) {\n      valueExpression = \"$event.target.value.trim()\";\n    }\n    if (number) {\n      valueExpression = \"_n(\" + valueExpression + \")\";\n    }\n\n    var code = genAssignmentCode(value, valueExpression);\n    if (needCompositionGuard) {\n      code = \"if($event.target.composing)return;\" + code;\n    }\n\n    addProp(el, 'value', (\"(\" + value + \")\"));\n    addHandler(el, event, code, null, true);\n    if (trim || number || type === 'number') {\n      addHandler(el, 'blur', '$forceUpdate()');\n    }\n  }\n\n  /*  */\n\n// normalize v-model event tokens that can only be determined at runtime.\n// it's important to place the event as the first in the array because\n// the whole point is ensuring the v-model callback gets called before\n// user-attached handlers.\n  function normalizeEvents (on) {\n    var event;\n    /* istanbul ignore if */\n    if (on[RANGE_TOKEN]) {\n      // IE input[type=range] only supports `change` event\n      event = isIE ? 'change' : 'input';\n      on[event] = [].concat(on[RANGE_TOKEN], on[event] || []);\n      delete on[RANGE_TOKEN];\n    }\n    if (on[CHECKBOX_RADIO_TOKEN]) {\n      // Chrome fires microtasks in between click/change, leads to #4521\n      event = isChrome ? 'click' : 'change';\n      on[event] = [].concat(on[CHECKBOX_RADIO_TOKEN], on[event] || []);\n      delete on[CHECKBOX_RADIO_TOKEN];\n    }\n  }\n\n  var target$1;\n\n  function add$1 (\n    event,\n    handler,\n    once,\n    capture\n  ) {\n    if (once) {\n      var oldHandler = handler;\n      var _target = target$1; // save current target element in closure\n      handler = function (ev) {\n        var res = arguments.length === 1\n          ? oldHandler(ev)\n          : oldHandler.apply(null, arguments);\n        if (res !== null) {\n          remove$2(event, handler, capture, _target);\n        }\n      };\n    }\n    target$1.addEventListener(event, handler, capture);\n  }\n\n  function remove$2 (\n    event,\n    handler,\n    capture,\n    _target\n  ) {\n    (_target || target$1).removeEventListener(event, handler, capture);\n  }\n\n  function updateDOMListeners (oldVnode, vnode) {\n    if (!oldVnode.data.on && !vnode.data.on) {\n      return\n    }\n    var on = vnode.data.on || {};\n    var oldOn = oldVnode.data.on || {};\n    target$1 = vnode.elm;\n    normalizeEvents(on);\n    updateListeners(on, oldOn, add$1, remove$2, vnode.context);\n  }\n\n  var events = {\n    create: updateDOMListeners,\n    update: updateDOMListeners\n  };\n\n  /*  */\n\n  function updateDOMProps (oldVnode, vnode) {\n    if (!oldVnode.data.domProps && !vnode.data.domProps) {\n      return\n    }\n    var key, cur;\n    var elm = vnode.elm;\n    var oldProps = oldVnode.data.domProps || {};\n    var props = vnode.data.domProps || {};\n    // clone observed objects, as the user probably wants to mutate it\n    if (props.__ob__) {\n      props = vnode.data.domProps = extend({}, props);\n    }\n\n    for (key in oldProps) {\n      if (props[key] == null) {\n        elm[key] = '';\n      }\n    }\n    for (key in props) {\n      cur = props[key];\n      // ignore children if the node has textContent or innerHTML,\n      // as these will throw away existing DOM nodes and cause removal errors\n      // on subsequent patches (#3360)\n      if (key === 'textContent' || key === 'innerHTML') {\n        if (vnode.children) { vnode.children.length = 0; }\n        if (cur === oldProps[key]) { continue }\n      }\n\n      if (key === 'value') {\n        // store value as _value as well since\n        // non-string values will be stringified\n        elm._value = cur;\n        // avoid resetting cursor position when value is the same\n        var strCur = cur == null ? '' : String(cur);\n        if (shouldUpdateValue(elm, vnode, strCur)) {\n          elm.value = strCur;\n        }\n      } else {\n        elm[key] = cur;\n      }\n    }\n  }\n\n// check platforms/web/util/attrs.js acceptValue\n\n\n  function shouldUpdateValue (\n    elm,\n    vnode,\n    checkVal\n  ) {\n    return (!elm.composing && (\n      vnode.tag === 'option' ||\n      isDirty(elm, checkVal) ||\n      isInputChanged(elm, checkVal)\n    ))\n  }\n\n  function isDirty (elm, checkVal) {\n    // return true when textbox (.number and .trim) loses focus and its value is not equal to the updated value\n    return document.activeElement !== elm && elm.value !== checkVal\n  }\n\n  function isInputChanged (elm, newVal) {\n    var value = elm.value;\n    var modifiers = elm._vModifiers; // injected by v-model runtime\n    if ((modifiers && modifiers.number) || elm.type === 'number') {\n      return toNumber(value) !== toNumber(newVal)\n    }\n    if (modifiers && modifiers.trim) {\n      return value.trim() !== newVal.trim()\n    }\n    return value !== newVal\n  }\n\n  var domProps = {\n    create: updateDOMProps,\n    update: updateDOMProps\n  };\n\n  /*  */\n\n  var parseStyleText = cached(function (cssText) {\n    var res = {};\n    var listDelimiter = /;(?![^(]*\\))/g;\n    var propertyDelimiter = /:(.+)/;\n    cssText.split(listDelimiter).forEach(function (item) {\n      if (item) {\n        var tmp = item.split(propertyDelimiter);\n        tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim());\n      }\n    });\n    return res\n  });\n\n// merge static and dynamic style data on the same vnode\n  function normalizeStyleData (data) {\n    var style = normalizeStyleBinding(data.style);\n    // static style is pre-processed into an object during compilation\n    // and is always a fresh object, so it's safe to merge into it\n    return data.staticStyle\n      ? extend(data.staticStyle, style)\n      : style\n  }\n\n// normalize possible array / string values into Object\n  function normalizeStyleBinding (bindingStyle) {\n    if (Array.isArray(bindingStyle)) {\n      return toObject(bindingStyle)\n    }\n    if (typeof bindingStyle === 'string') {\n      return parseStyleText(bindingStyle)\n    }\n    return bindingStyle\n  }\n\n  /**\n   * parent component style should be after child's\n   * so that parent component's style could override it\n   */\n  function getStyle (vnode, checkChild) {\n    var res = {};\n    var styleData;\n\n    if (checkChild) {\n      var childNode = vnode;\n      while (childNode.componentInstance) {\n        childNode = childNode.componentInstance._vnode;\n        if (childNode.data && (styleData = normalizeStyleData(childNode.data))) {\n          extend(res, styleData);\n        }\n      }\n    }\n\n    if ((styleData = normalizeStyleData(vnode.data))) {\n      extend(res, styleData);\n    }\n\n    var parentNode = vnode;\n    while ((parentNode = parentNode.parent)) {\n      if (parentNode.data && (styleData = normalizeStyleData(parentNode.data))) {\n        extend(res, styleData);\n      }\n    }\n    return res\n  }\n\n  /*  */\n\n  var cssVarRE = /^--/;\n  var importantRE = /\\s*!important$/;\n  var setProp = function (el, name, val) {\n    /* istanbul ignore if */\n    if (cssVarRE.test(name)) {\n      el.style.setProperty(name, val);\n    } else if (importantRE.test(val)) {\n      el.style.setProperty(name, val.replace(importantRE, ''), 'important');\n    } else {\n      el.style[normalize(name)] = val;\n    }\n  };\n\n  var prefixes = ['Webkit', 'Moz', 'ms'];\n\n  var testEl;\n  var normalize = cached(function (prop) {\n    testEl = testEl || document.createElement('div');\n    prop = camelize(prop);\n    if (prop !== 'filter' && (prop in testEl.style)) {\n      return prop\n    }\n    var upper = prop.charAt(0).toUpperCase() + prop.slice(1);\n    for (var i = 0; i < prefixes.length; i++) {\n      var prefixed = prefixes[i] + upper;\n      if (prefixed in testEl.style) {\n        return prefixed\n      }\n    }\n  });\n\n  function updateStyle (oldVnode, vnode) {\n    var data = vnode.data;\n    var oldData = oldVnode.data;\n\n    if (!data.staticStyle && !data.style &&\n      !oldData.staticStyle && !oldData.style) {\n      return\n    }\n\n    var cur, name;\n    var el = vnode.elm;\n    var oldStaticStyle = oldVnode.data.staticStyle;\n    var oldStyleBinding = oldVnode.data.style || {};\n\n    // if static style exists, stylebinding already merged into it when doing normalizeStyleData\n    var oldStyle = oldStaticStyle || oldStyleBinding;\n\n    var style = normalizeStyleBinding(vnode.data.style) || {};\n\n    vnode.data.style = style.__ob__ ? extend({}, style) : style;\n\n    var newStyle = getStyle(vnode, true);\n\n    for (name in oldStyle) {\n      if (newStyle[name] == null) {\n        setProp(el, name, '');\n      }\n    }\n    for (name in newStyle) {\n      cur = newStyle[name];\n      if (cur !== oldStyle[name]) {\n        // ie9 setting to null has no effect, must use empty string\n        setProp(el, name, cur == null ? '' : cur);\n      }\n    }\n  }\n\n  var style = {\n    create: updateStyle,\n    update: updateStyle\n  };\n\n  /*  */\n\n  /**\n   * Add class with compatibility for SVG since classList is not supported on\n   * SVG elements in IE\n   */\n  function addClass (el, cls) {\n    /* istanbul ignore if */\n    if (!cls || !(cls = cls.trim())) {\n      return\n    }\n\n    /* istanbul ignore else */\n    if (el.classList) {\n      if (cls.indexOf(' ') > -1) {\n        cls.split(/\\s+/).forEach(function (c) { return el.classList.add(c); });\n      } else {\n        el.classList.add(cls);\n      }\n    } else {\n      var cur = \" \" + (el.getAttribute('class') || '') + \" \";\n      if (cur.indexOf(' ' + cls + ' ') < 0) {\n        el.setAttribute('class', (cur + cls).trim());\n      }\n    }\n  }\n\n  /**\n   * Remove class with compatibility for SVG since classList is not supported on\n   * SVG elements in IE\n   */\n  function removeClass (el, cls) {\n    /* istanbul ignore if */\n    if (!cls || !(cls = cls.trim())) {\n      return\n    }\n\n    /* istanbul ignore else */\n    if (el.classList) {\n      if (cls.indexOf(' ') > -1) {\n        cls.split(/\\s+/).forEach(function (c) { return el.classList.remove(c); });\n      } else {\n        el.classList.remove(cls);\n      }\n    } else {\n      var cur = \" \" + (el.getAttribute('class') || '') + \" \";\n      var tar = ' ' + cls + ' ';\n      while (cur.indexOf(tar) >= 0) {\n        cur = cur.replace(tar, ' ');\n      }\n      el.setAttribute('class', cur.trim());\n    }\n  }\n\n  /*  */\n\n  function resolveTransition (def$$1) {\n    if (!def$$1) {\n      return\n    }\n    /* istanbul ignore else */\n    if (typeof def$$1 === 'object') {\n      var res = {};\n      if (def$$1.css !== false) {\n        extend(res, autoCssTransition(def$$1.name || 'v'));\n      }\n      extend(res, def$$1);\n      return res\n    } else if (typeof def$$1 === 'string') {\n      return autoCssTransition(def$$1)\n    }\n  }\n\n  var autoCssTransition = cached(function (name) {\n    return {\n      enterClass: (name + \"-enter\"),\n      enterToClass: (name + \"-enter-to\"),\n      enterActiveClass: (name + \"-enter-active\"),\n      leaveClass: (name + \"-leave\"),\n      leaveToClass: (name + \"-leave-to\"),\n      leaveActiveClass: (name + \"-leave-active\")\n    }\n  });\n\n  var hasTransition = inBrowser && !isIE9;\n  var TRANSITION = 'transition';\n  var ANIMATION = 'animation';\n\n// Transition property/event sniffing\n  var transitionProp = 'transition';\n  var transitionEndEvent = 'transitionend';\n  var animationProp = 'animation';\n  var animationEndEvent = 'animationend';\n  if (hasTransition) {\n    /* istanbul ignore if */\n    if (window.ontransitionend === undefined &&\n      window.onwebkittransitionend !== undefined) {\n      transitionProp = 'WebkitTransition';\n      transitionEndEvent = 'webkitTransitionEnd';\n    }\n    if (window.onanimationend === undefined &&\n      window.onwebkitanimationend !== undefined) {\n      animationProp = 'WebkitAnimation';\n      animationEndEvent = 'webkitAnimationEnd';\n    }\n  }\n\n// binding to window is necessary to make hot reload work in IE in strict mode\n  var raf = inBrowser && window.requestAnimationFrame\n    ? window.requestAnimationFrame.bind(window)\n    : setTimeout;\n\n  function nextFrame (fn) {\n    raf(function () {\n      raf(fn);\n    });\n  }\n\n  function addTransitionClass (el, cls) {\n    (el._transitionClasses || (el._transitionClasses = [])).push(cls);\n    addClass(el, cls);\n  }\n\n  function removeTransitionClass (el, cls) {\n    if (el._transitionClasses) {\n      remove(el._transitionClasses, cls);\n    }\n    removeClass(el, cls);\n  }\n\n  function whenTransitionEnds (\n    el,\n    expectedType,\n    cb\n  ) {\n    var ref = getTransitionInfo(el, expectedType);\n    var type = ref.type;\n    var timeout = ref.timeout;\n    var propCount = ref.propCount;\n    if (!type) { return cb() }\n    var event = type === TRANSITION ? transitionEndEvent : animationEndEvent;\n    var ended = 0;\n    var end = function () {\n      el.removeEventListener(event, onEnd);\n      cb();\n    };\n    var onEnd = function (e) {\n      if (e.target === el) {\n        if (++ended >= propCount) {\n          end();\n        }\n      }\n    };\n    setTimeout(function () {\n      if (ended < propCount) {\n        end();\n      }\n    }, timeout + 1);\n    el.addEventListener(event, onEnd);\n  }\n\n  var transformRE = /\\b(transform|all)(,|$)/;\n\n  function getTransitionInfo (el, expectedType) {\n    var styles = window.getComputedStyle(el);\n    var transitionDelays = styles[transitionProp + 'Delay'].split(', ');\n    var transitionDurations = styles[transitionProp + 'Duration'].split(', ');\n    var transitionTimeout = getTimeout(transitionDelays, transitionDurations);\n    var animationDelays = styles[animationProp + 'Delay'].split(', ');\n    var animationDurations = styles[animationProp + 'Duration'].split(', ');\n    var animationTimeout = getTimeout(animationDelays, animationDurations);\n\n    var type;\n    var timeout = 0;\n    var propCount = 0;\n    /* istanbul ignore if */\n    if (expectedType === TRANSITION) {\n      if (transitionTimeout > 0) {\n        type = TRANSITION;\n        timeout = transitionTimeout;\n        propCount = transitionDurations.length;\n      }\n    } else if (expectedType === ANIMATION) {\n      if (animationTimeout > 0) {\n        type = ANIMATION;\n        timeout = animationTimeout;\n        propCount = animationDurations.length;\n      }\n    } else {\n      timeout = Math.max(transitionTimeout, animationTimeout);\n      type = timeout > 0\n        ? transitionTimeout > animationTimeout\n          ? TRANSITION\n          : ANIMATION\n        : null;\n      propCount = type\n        ? type === TRANSITION\n          ? transitionDurations.length\n          : animationDurations.length\n        : 0;\n    }\n    var hasTransform =\n      type === TRANSITION &&\n      transformRE.test(styles[transitionProp + 'Property']);\n    return {\n      type: type,\n      timeout: timeout,\n      propCount: propCount,\n      hasTransform: hasTransform\n    }\n  }\n\n  function getTimeout (delays, durations) {\n    /* istanbul ignore next */\n    while (delays.length < durations.length) {\n      delays = delays.concat(delays);\n    }\n\n    return Math.max.apply(null, durations.map(function (d, i) {\n      return toMs(d) + toMs(delays[i])\n    }))\n  }\n\n  function toMs (s) {\n    return Number(s.slice(0, -1)) * 1000\n  }\n\n  /*  */\n\n  function enter (vnode, toggleDisplay) {\n    var el = vnode.elm;\n\n    // call leave callback now\n    if (el._leaveCb) {\n      el._leaveCb.cancelled = true;\n      el._leaveCb();\n    }\n\n    var data = resolveTransition(vnode.data.transition);\n    if (!data) {\n      return\n    }\n\n    /* istanbul ignore if */\n    if (el._enterCb || el.nodeType !== 1) {\n      return\n    }\n\n    var css = data.css;\n    var type = data.type;\n    var enterClass = data.enterClass;\n    var enterToClass = data.enterToClass;\n    var enterActiveClass = data.enterActiveClass;\n    var appearClass = data.appearClass;\n    var appearToClass = data.appearToClass;\n    var appearActiveClass = data.appearActiveClass;\n    var beforeEnter = data.beforeEnter;\n    var enter = data.enter;\n    var afterEnter = data.afterEnter;\n    var enterCancelled = data.enterCancelled;\n    var beforeAppear = data.beforeAppear;\n    var appear = data.appear;\n    var afterAppear = data.afterAppear;\n    var appearCancelled = data.appearCancelled;\n    var duration = data.duration;\n\n    // activeInstance will always be the <transition> component managing this\n    // transition. One edge case to check is when the <transition> is placed\n    // as the root node of a child component. In that case we need to check\n    // <transition>'s parent for appear check.\n    var context = activeInstance;\n    var transitionNode = activeInstance.$vnode;\n    while (transitionNode && transitionNode.parent) {\n      transitionNode = transitionNode.parent;\n      context = transitionNode.context;\n    }\n\n    var isAppear = !context._isMounted || !vnode.isRootInsert;\n\n    if (isAppear && !appear && appear !== '') {\n      return\n    }\n\n    var startClass = isAppear && appearClass\n      ? appearClass\n      : enterClass;\n    var activeClass = isAppear && appearActiveClass\n      ? appearActiveClass\n      : enterActiveClass;\n    var toClass = isAppear && appearToClass\n      ? appearToClass\n      : enterToClass;\n\n    var beforeEnterHook = isAppear\n      ? (beforeAppear || beforeEnter)\n      : beforeEnter;\n    var enterHook = isAppear\n      ? (typeof appear === 'function' ? appear : enter)\n      : enter;\n    var afterEnterHook = isAppear\n      ? (afterAppear || afterEnter)\n      : afterEnter;\n    var enterCancelledHook = isAppear\n      ? (appearCancelled || enterCancelled)\n      : enterCancelled;\n\n    var explicitEnterDuration = toNumber(\n      isObject(duration)\n        ? duration.enter\n        : duration\n    );\n\n    if (\"development\" !== 'production' && explicitEnterDuration != null) {\n      checkDuration(explicitEnterDuration, 'enter', vnode);\n    }\n\n    var expectsCSS = css !== false && !isIE9;\n    var userWantsControl = getHookArgumentsLength(enterHook);\n\n    var cb = el._enterCb = once(function () {\n      if (expectsCSS) {\n        removeTransitionClass(el, toClass);\n        removeTransitionClass(el, activeClass);\n      }\n      if (cb.cancelled) {\n        if (expectsCSS) {\n          removeTransitionClass(el, startClass);\n        }\n        enterCancelledHook && enterCancelledHook(el);\n      } else {\n        afterEnterHook && afterEnterHook(el);\n      }\n      el._enterCb = null;\n    });\n\n    if (!vnode.data.show) {\n      // remove pending leave element on enter by injecting an insert hook\n      mergeVNodeHook(vnode.data.hook || (vnode.data.hook = {}), 'insert', function () {\n        var parent = el.parentNode;\n        var pendingNode = parent && parent._pending && parent._pending[vnode.key];\n        if (pendingNode &&\n          pendingNode.tag === vnode.tag &&\n          pendingNode.elm._leaveCb) {\n          pendingNode.elm._leaveCb();\n        }\n        enterHook && enterHook(el, cb);\n      });\n    }\n\n    // start enter transition\n    beforeEnterHook && beforeEnterHook(el);\n    if (expectsCSS) {\n      addTransitionClass(el, startClass);\n      addTransitionClass(el, activeClass);\n      nextFrame(function () {\n        addTransitionClass(el, toClass);\n        removeTransitionClass(el, startClass);\n        if (!cb.cancelled && !userWantsControl) {\n          if (isValidDuration(explicitEnterDuration)) {\n            setTimeout(cb, explicitEnterDuration);\n          } else {\n            whenTransitionEnds(el, type, cb);\n          }\n        }\n      });\n    }\n\n    if (vnode.data.show) {\n      toggleDisplay && toggleDisplay();\n      enterHook && enterHook(el, cb);\n    }\n\n    if (!expectsCSS && !userWantsControl) {\n      cb();\n    }\n  }\n\n  function leave (vnode, rm) {\n    var el = vnode.elm;\n\n    // call enter callback now\n    if (el._enterCb) {\n      el._enterCb.cancelled = true;\n      el._enterCb();\n    }\n\n    var data = resolveTransition(vnode.data.transition);\n    if (!data) {\n      return rm()\n    }\n\n    /* istanbul ignore if */\n    if (el._leaveCb || el.nodeType !== 1) {\n      return\n    }\n\n    var css = data.css;\n    var type = data.type;\n    var leaveClass = data.leaveClass;\n    var leaveToClass = data.leaveToClass;\n    var leaveActiveClass = data.leaveActiveClass;\n    var beforeLeave = data.beforeLeave;\n    var leave = data.leave;\n    var afterLeave = data.afterLeave;\n    var leaveCancelled = data.leaveCancelled;\n    var delayLeave = data.delayLeave;\n    var duration = data.duration;\n\n    var expectsCSS = css !== false && !isIE9;\n    var userWantsControl = getHookArgumentsLength(leave);\n\n    var explicitLeaveDuration = toNumber(\n      isObject(duration)\n        ? duration.leave\n        : duration\n    );\n\n    if (\"development\" !== 'production' && explicitLeaveDuration != null) {\n      checkDuration(explicitLeaveDuration, 'leave', vnode);\n    }\n\n    var cb = el._leaveCb = once(function () {\n      if (el.parentNode && el.parentNode._pending) {\n        el.parentNode._pending[vnode.key] = null;\n      }\n      if (expectsCSS) {\n        removeTransitionClass(el, leaveToClass);\n        removeTransitionClass(el, leaveActiveClass);\n      }\n      if (cb.cancelled) {\n        if (expectsCSS) {\n          removeTransitionClass(el, leaveClass);\n        }\n        leaveCancelled && leaveCancelled(el);\n      } else {\n        rm();\n        afterLeave && afterLeave(el);\n      }\n      el._leaveCb = null;\n    });\n\n    if (delayLeave) {\n      delayLeave(performLeave);\n    } else {\n      performLeave();\n    }\n\n    function performLeave () {\n      // the delayed leave may have already been cancelled\n      if (cb.cancelled) {\n        return\n      }\n      // record leaving element\n      if (!vnode.data.show) {\n        (el.parentNode._pending || (el.parentNode._pending = {}))[vnode.key] = vnode;\n      }\n      beforeLeave && beforeLeave(el);\n      if (expectsCSS) {\n        addTransitionClass(el, leaveClass);\n        addTransitionClass(el, leaveActiveClass);\n        nextFrame(function () {\n          addTransitionClass(el, leaveToClass);\n          removeTransitionClass(el, leaveClass);\n          if (!cb.cancelled && !userWantsControl) {\n            if (isValidDuration(explicitLeaveDuration)) {\n              setTimeout(cb, explicitLeaveDuration);\n            } else {\n              whenTransitionEnds(el, type, cb);\n            }\n          }\n        });\n      }\n      leave && leave(el, cb);\n      if (!expectsCSS && !userWantsControl) {\n        cb();\n      }\n    }\n  }\n\n// only used in dev mode\n  function checkDuration (val, name, vnode) {\n    if (typeof val !== 'number') {\n      warn(\n        \"<transition> explicit \" + name + \" duration is not a valid number - \" +\n        \"got \" + (JSON.stringify(val)) + \".\",\n        vnode.context\n      );\n    } else if (isNaN(val)) {\n      warn(\n        \"<transition> explicit \" + name + \" duration is NaN - \" +\n        'the duration expression might be incorrect.',\n        vnode.context\n      );\n    }\n  }\n\n  function isValidDuration (val) {\n    return typeof val === 'number' && !isNaN(val)\n  }\n\n  /**\n   * Normalize a transition hook's argument length. The hook may be:\n   * - a merged hook (invoker) with the original in .fns\n   * - a wrapped component method (check ._length)\n   * - a plain function (.length)\n   */\n  function getHookArgumentsLength (fn) {\n    if (!fn) { return false }\n    var invokerFns = fn.fns;\n    if (invokerFns) {\n      // invoker\n      return getHookArgumentsLength(\n        Array.isArray(invokerFns)\n          ? invokerFns[0]\n          : invokerFns\n      )\n    } else {\n      return (fn._length || fn.length) > 1\n    }\n  }\n\n  function _enter (_, vnode) {\n    if (!vnode.data.show) {\n      enter(vnode);\n    }\n  }\n\n  var transition = inBrowser ? {\n      create: _enter,\n      activate: _enter,\n      remove: function remove$$1 (vnode, rm) {\n        /* istanbul ignore else */\n        if (!vnode.data.show) {\n          leave(vnode, rm);\n        } else {\n          rm();\n        }\n      }\n    } : {};\n\n  var platformModules = [\n    attrs,\n    klass,\n    events,\n    domProps,\n    style,\n    transition\n  ];\n\n  /*  */\n\n// the directive module should be applied last, after all\n// built-in modules have been applied.\n  var modules = platformModules.concat(baseModules);\n\n  var patch = createPatchFunction({ nodeOps: nodeOps, modules: modules });\n\n  /**\n   * Not type checking this file because flow doesn't like attaching\n   * properties to Elements.\n   */\n\n  /* istanbul ignore if */\n  if (isIE9) {\n    // http://www.matts411.com/post/internet-explorer-9-oninput/\n    document.addEventListener('selectionchange', function () {\n      var el = document.activeElement;\n      if (el && el.vmodel) {\n        trigger(el, 'input');\n      }\n    });\n  }\n\n  var model$1 = {\n    inserted: function inserted (el, binding, vnode) {\n      if (vnode.tag === 'select') {\n        var cb = function () {\n          setSelected(el, binding, vnode.context);\n        };\n        cb();\n        /* istanbul ignore if */\n        if (isIE || isEdge) {\n          setTimeout(cb, 0);\n        }\n      } else if (vnode.tag === 'textarea' || el.type === 'text') {\n        el._vModifiers = binding.modifiers;\n        if (!binding.modifiers.lazy) {\n          if (!isAndroid) {\n            el.addEventListener('compositionstart', onCompositionStart);\n            el.addEventListener('compositionend', onCompositionEnd);\n          }\n          /* istanbul ignore if */\n          if (isIE9) {\n            el.vmodel = true;\n          }\n        }\n      }\n    },\n    componentUpdated: function componentUpdated (el, binding, vnode) {\n      if (vnode.tag === 'select') {\n        setSelected(el, binding, vnode.context);\n        // in case the options rendered by v-for have changed,\n        // it's possible that the value is out-of-sync with the rendered options.\n        // detect such cases and filter out values that no longer has a matching\n        // option in the DOM.\n        var needReset = el.multiple\n          ? binding.value.some(function (v) { return hasNoMatchingOption(v, el.options); })\n          : binding.value !== binding.oldValue && hasNoMatchingOption(binding.value, el.options);\n        if (needReset) {\n          trigger(el, 'change');\n        }\n      }\n    }\n  };\n\n  function setSelected (el, binding, vm) {\n    var value = binding.value;\n    var isMultiple = el.multiple;\n    if (isMultiple && !Array.isArray(value)) {\n      \"development\" !== 'production' && warn(\n        \"<select multiple v-model=\\\"\" + (binding.expression) + \"\\\"> \" +\n        \"expects an Array value for its binding, but got \" + (Object.prototype.toString.call(value).slice(8, -1)),\n        vm\n      );\n      return\n    }\n    var selected, option;\n    for (var i = 0, l = el.options.length; i < l; i++) {\n      option = el.options[i];\n      if (isMultiple) {\n        selected = looseIndexOf(value, getValue(option)) > -1;\n        if (option.selected !== selected) {\n          option.selected = selected;\n        }\n      } else {\n        if (looseEqual(getValue(option), value)) {\n          if (el.selectedIndex !== i) {\n            el.selectedIndex = i;\n          }\n          return\n        }\n      }\n    }\n    if (!isMultiple) {\n      el.selectedIndex = -1;\n    }\n  }\n\n  function hasNoMatchingOption (value, options) {\n    for (var i = 0, l = options.length; i < l; i++) {\n      if (looseEqual(getValue(options[i]), value)) {\n        return false\n      }\n    }\n    return true\n  }\n\n  function getValue (option) {\n    return '_value' in option\n      ? option._value\n      : option.value\n  }\n\n  function onCompositionStart (e) {\n    e.target.composing = true;\n  }\n\n  function onCompositionEnd (e) {\n    e.target.composing = false;\n    trigger(e.target, 'input');\n  }\n\n  function trigger (el, type) {\n    var e = document.createEvent('HTMLEvents');\n    e.initEvent(type, true, true);\n    el.dispatchEvent(e);\n  }\n\n  /*  */\n\n// recursively search for possible transition defined inside the component root\n  function locateNode (vnode) {\n    return vnode.componentInstance && (!vnode.data || !vnode.data.transition)\n      ? locateNode(vnode.componentInstance._vnode)\n      : vnode\n  }\n\n  var show = {\n    bind: function bind (el, ref, vnode) {\n      var value = ref.value;\n\n      vnode = locateNode(vnode);\n      var transition = vnode.data && vnode.data.transition;\n      var originalDisplay = el.__vOriginalDisplay =\n        el.style.display === 'none' ? '' : el.style.display;\n      if (value && transition && !isIE9) {\n        vnode.data.show = true;\n        enter(vnode, function () {\n          el.style.display = originalDisplay;\n        });\n      } else {\n        el.style.display = value ? originalDisplay : 'none';\n      }\n    },\n\n    update: function update (el, ref, vnode) {\n      var value = ref.value;\n      var oldValue = ref.oldValue;\n\n      /* istanbul ignore if */\n      if (value === oldValue) { return }\n      vnode = locateNode(vnode);\n      var transition = vnode.data && vnode.data.transition;\n      if (transition && !isIE9) {\n        vnode.data.show = true;\n        if (value) {\n          enter(vnode, function () {\n            el.style.display = el.__vOriginalDisplay;\n          });\n        } else {\n          leave(vnode, function () {\n            el.style.display = 'none';\n          });\n        }\n      } else {\n        el.style.display = value ? el.__vOriginalDisplay : 'none';\n      }\n    },\n\n    unbind: function unbind (\n      el,\n      binding,\n      vnode,\n      oldVnode,\n      isDestroy\n    ) {\n      if (!isDestroy) {\n        el.style.display = el.__vOriginalDisplay;\n      }\n    }\n  };\n\n  var platformDirectives = {\n    model: model$1,\n    show: show\n  };\n\n  /*  */\n\n// Provides transition support for a single element/component.\n// supports transition mode (out-in / in-out)\n\n  var transitionProps = {\n    name: String,\n    appear: Boolean,\n    css: Boolean,\n    mode: String,\n    type: String,\n    enterClass: String,\n    leaveClass: String,\n    enterToClass: String,\n    leaveToClass: String,\n    enterActiveClass: String,\n    leaveActiveClass: String,\n    appearClass: String,\n    appearActiveClass: String,\n    appearToClass: String,\n    duration: [Number, String, Object]\n  };\n\n// in case the child is also an abstract component, e.g. <keep-alive>\n// we want to recursively retrieve the real component to be rendered\n  function getRealChild (vnode) {\n    var compOptions = vnode && vnode.componentOptions;\n    if (compOptions && compOptions.Ctor.options.abstract) {\n      return getRealChild(getFirstComponentChild(compOptions.children))\n    } else {\n      return vnode\n    }\n  }\n\n  function extractTransitionData (comp) {\n    var data = {};\n    var options = comp.$options;\n    // props\n    for (var key in options.propsData) {\n      data[key] = comp[key];\n    }\n    // events.\n    // extract listeners and pass them directly to the transition methods\n    var listeners = options._parentListeners;\n    for (var key$1 in listeners) {\n      data[camelize(key$1)] = listeners[key$1];\n    }\n    return data\n  }\n\n  function placeholder (h, rawChild) {\n    return /\\d-keep-alive$/.test(rawChild.tag)\n      ? h('keep-alive')\n      : null\n  }\n\n  function hasParentTransition (vnode) {\n    while ((vnode = vnode.parent)) {\n      if (vnode.data.transition) {\n        return true\n      }\n    }\n  }\n\n  function isSameChild (child, oldChild) {\n    return oldChild.key === child.key && oldChild.tag === child.tag\n  }\n\n  var Transition = {\n    name: 'transition',\n    props: transitionProps,\n    abstract: true,\n\n    render: function render (h) {\n      var this$1 = this;\n\n      var children = this.$slots.default;\n      if (!children) {\n        return\n      }\n\n      // filter out text nodes (possible whitespaces)\n      children = children.filter(function (c) { return c.tag; });\n      /* istanbul ignore if */\n      if (!children.length) {\n        return\n      }\n\n      // warn multiple elements\n      if (\"development\" !== 'production' && children.length > 1) {\n        warn(\n          '<transition> can only be used on a single element. Use ' +\n          '<transition-group> for lists.',\n          this.$parent\n        );\n      }\n\n      var mode = this.mode;\n\n      // warn invalid mode\n      if (\"development\" !== 'production' &&\n        mode && mode !== 'in-out' && mode !== 'out-in') {\n        warn(\n          'invalid <transition> mode: ' + mode,\n          this.$parent\n        );\n      }\n\n      var rawChild = children[0];\n\n      // if this is a component root node and the component's\n      // parent container node also has transition, skip.\n      if (hasParentTransition(this.$vnode)) {\n        return rawChild\n      }\n\n      // apply transition data to child\n      // use getRealChild() to ignore abstract components e.g. keep-alive\n      var child = getRealChild(rawChild);\n      /* istanbul ignore if */\n      if (!child) {\n        return rawChild\n      }\n\n      if (this._leaving) {\n        return placeholder(h, rawChild)\n      }\n\n      // ensure a key that is unique to the vnode type and to this transition\n      // component instance. This key will be used to remove pending leaving nodes\n      // during entering.\n      var id = \"__transition-\" + (this._uid) + \"-\";\n      child.key = child.key == null\n        ? id + child.tag\n        : isPrimitive(child.key)\n          ? (String(child.key).indexOf(id) === 0 ? child.key : id + child.key)\n          : child.key;\n\n      var data = (child.data || (child.data = {})).transition = extractTransitionData(this);\n      var oldRawChild = this._vnode;\n      var oldChild = getRealChild(oldRawChild);\n\n      // mark v-show\n      // so that the transition module can hand over the control to the directive\n      if (child.data.directives && child.data.directives.some(function (d) { return d.name === 'show'; })) {\n        child.data.show = true;\n      }\n\n      if (oldChild && oldChild.data && !isSameChild(child, oldChild)) {\n        // replace old child transition data with fresh one\n        // important for dynamic transitions!\n        var oldData = oldChild && (oldChild.data.transition = extend({}, data));\n        // handle transition mode\n        if (mode === 'out-in') {\n          // return placeholder node and queue update when leave finishes\n          this._leaving = true;\n          mergeVNodeHook(oldData, 'afterLeave', function () {\n            this$1._leaving = false;\n            this$1.$forceUpdate();\n          });\n          return placeholder(h, rawChild)\n        } else if (mode === 'in-out') {\n          var delayedLeave;\n          var performLeave = function () { delayedLeave(); };\n          mergeVNodeHook(data, 'afterEnter', performLeave);\n          mergeVNodeHook(data, 'enterCancelled', performLeave);\n          mergeVNodeHook(oldData, 'delayLeave', function (leave) { delayedLeave = leave; });\n        }\n      }\n\n      return rawChild\n    }\n  };\n\n  /*  */\n\n// Provides transition support for list items.\n// supports move transitions using the FLIP technique.\n\n// Because the vdom's children update algorithm is \"unstable\" - i.e.\n// it doesn't guarantee the relative positioning of removed elements,\n// we force transition-group to update its children into two passes:\n// in the first pass, we remove all nodes that need to be removed,\n// triggering their leaving transition; in the second pass, we insert/move\n// into the final desired state. This way in the second pass removed\n// nodes will remain where they should be.\n\n  var props = extend({\n    tag: String,\n    moveClass: String\n  }, transitionProps);\n\n  delete props.mode;\n\n  var TransitionGroup = {\n    props: props,\n\n    render: function render (h) {\n      var tag = this.tag || this.$vnode.data.tag || 'span';\n      var map = Object.create(null);\n      var prevChildren = this.prevChildren = this.children;\n      var rawChildren = this.$slots.default || [];\n      var children = this.children = [];\n      var transitionData = extractTransitionData(this);\n\n      for (var i = 0; i < rawChildren.length; i++) {\n        var c = rawChildren[i];\n        if (c.tag) {\n          if (c.key != null && String(c.key).indexOf('__vlist') !== 0) {\n            children.push(c);\n            map[c.key] = c\n            ;(c.data || (c.data = {})).transition = transitionData;\n          } else {\n            var opts = c.componentOptions;\n            var name = opts ? (opts.Ctor.options.name || opts.tag || '') : c.tag;\n            warn((\"<transition-group> children must be keyed: <\" + name + \">\"));\n          }\n        }\n      }\n\n      if (prevChildren) {\n        var kept = [];\n        var removed = [];\n        for (var i$1 = 0; i$1 < prevChildren.length; i$1++) {\n          var c$1 = prevChildren[i$1];\n          c$1.data.transition = transitionData;\n          c$1.data.pos = c$1.elm.getBoundingClientRect();\n          if (map[c$1.key]) {\n            kept.push(c$1);\n          } else {\n            removed.push(c$1);\n          }\n        }\n        this.kept = h(tag, null, kept);\n        this.removed = removed;\n      }\n\n      return h(tag, null, children)\n    },\n\n    beforeUpdate: function beforeUpdate () {\n      // force removing pass\n      this.__patch__(\n        this._vnode,\n        this.kept,\n        false, // hydrating\n        true // removeOnly (!important, avoids unnecessary moves)\n      );\n      this._vnode = this.kept;\n    },\n\n    updated: function updated () {\n      var children = this.prevChildren;\n      var moveClass = this.moveClass || ((this.name || 'v') + '-move');\n      if (!children.length || !this.hasMove(children[0].elm, moveClass)) {\n        return\n      }\n\n      // we divide the work into three loops to avoid mixing DOM reads and writes\n      // in each iteration - which helps prevent layout thrashing.\n      children.forEach(callPendingCbs);\n      children.forEach(recordPosition);\n      children.forEach(applyTranslation);\n\n      // force reflow to put everything in position\n      var body = document.body;\n      var f = body.offsetHeight; // eslint-disable-line\n\n      children.forEach(function (c) {\n        if (c.data.moved) {\n          var el = c.elm;\n          var s = el.style;\n          addTransitionClass(el, moveClass);\n          s.transform = s.WebkitTransform = s.transitionDuration = '';\n          el.addEventListener(transitionEndEvent, el._moveCb = function cb (e) {\n            if (!e || /transform$/.test(e.propertyName)) {\n              el.removeEventListener(transitionEndEvent, cb);\n              el._moveCb = null;\n              removeTransitionClass(el, moveClass);\n            }\n          });\n        }\n      });\n    },\n\n    methods: {\n      hasMove: function hasMove (el, moveClass) {\n        /* istanbul ignore if */\n        if (!hasTransition) {\n          return false\n        }\n        if (this._hasMove != null) {\n          return this._hasMove\n        }\n        // Detect whether an element with the move class applied has\n        // CSS transitions. Since the element may be inside an entering\n        // transition at this very moment, we make a clone of it and remove\n        // all other transition classes applied to ensure only the move class\n        // is applied.\n        var clone = el.cloneNode();\n        if (el._transitionClasses) {\n          el._transitionClasses.forEach(function (cls) { removeClass(clone, cls); });\n        }\n        addClass(clone, moveClass);\n        clone.style.display = 'none';\n        this.$el.appendChild(clone);\n        var info = getTransitionInfo(clone);\n        this.$el.removeChild(clone);\n        return (this._hasMove = info.hasTransform)\n      }\n    }\n  };\n\n  function callPendingCbs (c) {\n    /* istanbul ignore if */\n    if (c.elm._moveCb) {\n      c.elm._moveCb();\n    }\n    /* istanbul ignore if */\n    if (c.elm._enterCb) {\n      c.elm._enterCb();\n    }\n  }\n\n  function recordPosition (c) {\n    c.data.newPos = c.elm.getBoundingClientRect();\n  }\n\n  function applyTranslation (c) {\n    var oldPos = c.data.pos;\n    var newPos = c.data.newPos;\n    var dx = oldPos.left - newPos.left;\n    var dy = oldPos.top - newPos.top;\n    if (dx || dy) {\n      c.data.moved = true;\n      var s = c.elm.style;\n      s.transform = s.WebkitTransform = \"translate(\" + dx + \"px,\" + dy + \"px)\";\n      s.transitionDuration = '0s';\n    }\n  }\n\n  var platformComponents = {\n    Transition: Transition,\n    TransitionGroup: TransitionGroup\n  };\n\n  /*  */\n\n// install platform specific utils\n  Vue$3.config.mustUseProp = mustUseProp;\n  Vue$3.config.isReservedTag = isReservedTag;\n  Vue$3.config.getTagNamespace = getTagNamespace;\n  Vue$3.config.isUnknownElement = isUnknownElement;\n\n// install platform runtime directives & components\n  extend(Vue$3.options.directives, platformDirectives);\n  extend(Vue$3.options.components, platformComponents);\n\n// install platform patch function\n  Vue$3.prototype.__patch__ = inBrowser ? patch : noop;\n\n// public mount method\n  Vue$3.prototype.$mount = function (\n    el,\n    hydrating\n  ) {\n    el = el && inBrowser ? query(el) : undefined;\n    return mountComponent(this, el, hydrating)\n  };\n\n// devtools global hook\n  /* istanbul ignore next */\n  setTimeout(function () {\n    if (config.devtools) {\n      if (devtools) {\n        devtools.emit('init', Vue$3);\n      } else if (\"development\" !== 'production' && isChrome) {\n        console[console.info ? 'info' : 'log'](\n          'Download the Vue Devtools extension for a better development experience:\\n' +\n          'https://github.com/vuejs/vue-devtools'\n        );\n      }\n    }\n    if (\"development\" !== 'production' &&\n      config.productionTip !== false &&\n      inBrowser && typeof console !== 'undefined') {\n      console[console.info ? 'info' : 'log'](\n        \"You are running Vue in development mode.\\n\" +\n        \"Make sure to turn on production mode when deploying for production.\\n\" +\n        \"See more tips at https://vuejs.org/guide/deployment.html\"\n      );\n    }\n  }, 0);\n\n  /*  */\n\n// check whether current browser encodes a char inside attribute values\n  function shouldDecode (content, encoded) {\n    var div = document.createElement('div');\n    div.innerHTML = \"<div a=\\\"\" + content + \"\\\">\";\n    return div.innerHTML.indexOf(encoded) > 0\n  }\n\n// #3663\n// IE encodes newlines inside attribute values while other browsers don't\n  var shouldDecodeNewlines = inBrowser ? shouldDecode('\\n', '&#10;') : false;\n\n  /*  */\n\n  var isUnaryTag = makeMap(\n    'area,base,br,col,embed,frame,hr,img,input,isindex,keygen,' +\n    'link,meta,param,source,track,wbr'\n  );\n\n// Elements that you can, intentionally, leave open\n// (and which close themselves)\n  var canBeLeftOpenTag = makeMap(\n    'colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source'\n  );\n\n// HTML5 tags https://html.spec.whatwg.org/multipage/indices.html#elements-3\n// Phrasing Content https://html.spec.whatwg.org/multipage/dom.html#phrasing-content\n  var isNonPhrasingTag = makeMap(\n    'address,article,aside,base,blockquote,body,caption,col,colgroup,dd,' +\n    'details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,' +\n    'h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,' +\n    'optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,' +\n    'title,tr,track'\n  );\n\n  /*  */\n\n  var decoder;\n\n  function decode (html) {\n    decoder = decoder || document.createElement('div');\n    decoder.innerHTML = html;\n    return decoder.textContent\n  }\n\n  /**\n   * Not type-checking this file because it's mostly vendor code.\n   */\n\n  /*!\n   * HTML Parser By John Resig (ejohn.org)\n   * Modified by Juriy \"kangax\" Zaytsev\n   * Original code by Erik Arvidsson, Mozilla Public License\n   * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js\n   */\n\n// Regular Expressions for parsing tags and attributes\n  var singleAttrIdentifier = /([^\\s\"'<>/=]+)/;\n  var singleAttrAssign = /(?:=)/;\n  var singleAttrValues = [\n    // attr value double quotes\n    /\"([^\"]*)\"+/.source,\n    // attr value, single quotes\n    /'([^']*)'+/.source,\n    // attr value, no quotes\n    /([^\\s\"'=<>`]+)/.source\n  ];\n  var attribute = new RegExp(\n    '^\\\\s*' + singleAttrIdentifier.source +\n    '(?:\\\\s*(' + singleAttrAssign.source + ')' +\n    '\\\\s*(?:' + singleAttrValues.join('|') + '))?'\n  );\n\n// could use https://www.w3.org/TR/1999/REC-xml-names-19990114/#NT-QName\n// but for Vue templates we can enforce a simple charset\n  var ncname = '[a-zA-Z_][\\\\w\\\\-\\\\.]*';\n  var qnameCapture = '((?:' + ncname + '\\\\:)?' + ncname + ')';\n  var startTagOpen = new RegExp('^<' + qnameCapture);\n  var startTagClose = /^\\s*(\\/?)>/;\n  var endTag = new RegExp('^<\\\\/' + qnameCapture + '[^>]*>');\n  var doctype = /^<!DOCTYPE [^>]+>/i;\n  var comment = /^<!--/;\n  var conditionalComment = /^<!\\[/;\n\n  var IS_REGEX_CAPTURING_BROKEN = false;\n  'x'.replace(/x(.)?/g, function (m, g) {\n    IS_REGEX_CAPTURING_BROKEN = g === '';\n  });\n\n// Special Elements (can contain anything)\n  var isPlainTextElement = makeMap('script,style,textarea', true);\n  var reCache = {};\n\n  var decodingMap = {\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&amp;': '&',\n    '&#10;': '\\n'\n  };\n  var encodedAttr = /&(?:lt|gt|quot|amp);/g;\n  var encodedAttrWithNewLines = /&(?:lt|gt|quot|amp|#10);/g;\n\n  function decodeAttr (value, shouldDecodeNewlines) {\n    var re = shouldDecodeNewlines ? encodedAttrWithNewLines : encodedAttr;\n    return value.replace(re, function (match) { return decodingMap[match]; })\n  }\n\n  function parseHTML (html, options) {\n    var stack = [];\n    var expectHTML = options.expectHTML;\n    var isUnaryTag$$1 = options.isUnaryTag || no;\n    var index = 0;\n    var last, lastTag;\n    while (html) {\n      last = html;\n      // Make sure we're not in a plaintext content element like script/style\n      if (!lastTag || !isPlainTextElement(lastTag)) {\n        var textEnd = html.indexOf('<');\n        if (textEnd === 0) {\n          // Comment:\n          if (comment.test(html)) {\n            var commentEnd = html.indexOf('-->');\n\n            if (commentEnd >= 0) {\n              advance(commentEnd + 3);\n              continue\n            }\n          }\n\n          // http://en.wikipedia.org/wiki/Conditional_comment#Downlevel-revealed_conditional_comment\n          if (conditionalComment.test(html)) {\n            var conditionalEnd = html.indexOf(']>');\n\n            if (conditionalEnd >= 0) {\n              advance(conditionalEnd + 2);\n              continue\n            }\n          }\n\n          // Doctype:\n          var doctypeMatch = html.match(doctype);\n          if (doctypeMatch) {\n            advance(doctypeMatch[0].length);\n            continue\n          }\n\n          // End tag:\n          var endTagMatch = html.match(endTag);\n          if (endTagMatch) {\n            var curIndex = index;\n            advance(endTagMatch[0].length);\n            parseEndTag(endTagMatch[1], curIndex, index);\n            continue\n          }\n\n          // Start tag:\n          var startTagMatch = parseStartTag();\n          if (startTagMatch) {\n            handleStartTag(startTagMatch);\n            continue\n          }\n        }\n\n        var text = (void 0), rest$1 = (void 0), next = (void 0);\n        if (textEnd >= 0) {\n          rest$1 = html.slice(textEnd);\n          while (\n          !endTag.test(rest$1) &&\n          !startTagOpen.test(rest$1) &&\n          !comment.test(rest$1) &&\n          !conditionalComment.test(rest$1)\n            ) {\n            // < in plain text, be forgiving and treat it as text\n            next = rest$1.indexOf('<', 1);\n            if (next < 0) { break }\n            textEnd += next;\n            rest$1 = html.slice(textEnd);\n          }\n          text = html.substring(0, textEnd);\n          advance(textEnd);\n        }\n\n        if (textEnd < 0) {\n          text = html;\n          html = '';\n        }\n\n        if (options.chars && text) {\n          options.chars(text);\n        }\n      } else {\n        var stackedTag = lastTag.toLowerCase();\n        var reStackedTag = reCache[stackedTag] || (reCache[stackedTag] = new RegExp('([\\\\s\\\\S]*?)(</' + stackedTag + '[^>]*>)', 'i'));\n        var endTagLength = 0;\n        var rest = html.replace(reStackedTag, function (all, text, endTag) {\n          endTagLength = endTag.length;\n          if (!isPlainTextElement(stackedTag) && stackedTag !== 'noscript') {\n            text = text\n              .replace(/<!--([\\s\\S]*?)-->/g, '$1')\n              .replace(/<!\\[CDATA\\[([\\s\\S]*?)]]>/g, '$1');\n          }\n          if (options.chars) {\n            options.chars(text);\n          }\n          return ''\n        });\n        index += html.length - rest.length;\n        html = rest;\n        parseEndTag(stackedTag, index - endTagLength, index);\n      }\n\n      if (html === last) {\n        options.chars && options.chars(html);\n        if (\"development\" !== 'production' && !stack.length && options.warn) {\n          options.warn((\"Mal-formatted tag at end of template: \\\"\" + html + \"\\\"\"));\n        }\n        break\n      }\n    }\n\n    // Clean up any remaining tags\n    parseEndTag();\n\n    function advance (n) {\n      index += n;\n      html = html.substring(n);\n    }\n\n    function parseStartTag () {\n      var start = html.match(startTagOpen);\n      if (start) {\n        var match = {\n          tagName: start[1],\n          attrs: [],\n          start: index\n        };\n        advance(start[0].length);\n        var end, attr;\n        while (!(end = html.match(startTagClose)) && (attr = html.match(attribute))) {\n          advance(attr[0].length);\n          match.attrs.push(attr);\n        }\n        if (end) {\n          match.unarySlash = end[1];\n          advance(end[0].length);\n          match.end = index;\n          return match\n        }\n      }\n    }\n\n    function handleStartTag (match) {\n      var tagName = match.tagName;\n      var unarySlash = match.unarySlash;\n\n      if (expectHTML) {\n        if (lastTag === 'p' && isNonPhrasingTag(tagName)) {\n          parseEndTag(lastTag);\n        }\n        if (canBeLeftOpenTag(tagName) && lastTag === tagName) {\n          parseEndTag(tagName);\n        }\n      }\n\n      var unary = isUnaryTag$$1(tagName) || tagName === 'html' && lastTag === 'head' || !!unarySlash;\n\n      var l = match.attrs.length;\n      var attrs = new Array(l);\n      for (var i = 0; i < l; i++) {\n        var args = match.attrs[i];\n        // hackish work around FF bug https://bugzilla.mozilla.org/show_bug.cgi?id=369778\n        if (IS_REGEX_CAPTURING_BROKEN && args[0].indexOf('\"\"') === -1) {\n          if (args[3] === '') { delete args[3]; }\n          if (args[4] === '') { delete args[4]; }\n          if (args[5] === '') { delete args[5]; }\n        }\n        var value = args[3] || args[4] || args[5] || '';\n        attrs[i] = {\n          name: args[1],\n          value: decodeAttr(\n            value,\n            options.shouldDecodeNewlines\n          )\n        };\n      }\n\n      if (!unary) {\n        stack.push({ tag: tagName, lowerCasedTag: tagName.toLowerCase(), attrs: attrs });\n        lastTag = tagName;\n      }\n\n      if (options.start) {\n        options.start(tagName, attrs, unary, match.start, match.end);\n      }\n    }\n\n    function parseEndTag (tagName, start, end) {\n      var pos, lowerCasedTagName;\n      if (start == null) { start = index; }\n      if (end == null) { end = index; }\n\n      if (tagName) {\n        lowerCasedTagName = tagName.toLowerCase();\n      }\n\n      // Find the closest opened tag of the same type\n      if (tagName) {\n        for (pos = stack.length - 1; pos >= 0; pos--) {\n          if (stack[pos].lowerCasedTag === lowerCasedTagName) {\n            break\n          }\n        }\n      } else {\n        // If no tag name is provided, clean shop\n        pos = 0;\n      }\n\n      if (pos >= 0) {\n        // Close all the open elements, up the stack\n        for (var i = stack.length - 1; i >= pos; i--) {\n          if (\"development\" !== 'production' &&\n            (i > pos || !tagName) &&\n            options.warn) {\n            options.warn(\n              (\"tag <\" + (stack[i].tag) + \"> has no matching end tag.\")\n            );\n          }\n          if (options.end) {\n            options.end(stack[i].tag, start, end);\n          }\n        }\n\n        // Remove the open elements from the stack\n        stack.length = pos;\n        lastTag = pos && stack[pos - 1].tag;\n      } else if (lowerCasedTagName === 'br') {\n        if (options.start) {\n          options.start(tagName, [], true, start, end);\n        }\n      } else if (lowerCasedTagName === 'p') {\n        if (options.start) {\n          options.start(tagName, [], false, start, end);\n        }\n        if (options.end) {\n          options.end(tagName, start, end);\n        }\n      }\n    }\n  }\n\n  /*  */\n\n  var defaultTagRE = /\\{\\{((?:.|\\n)+?)\\}\\}/g;\n  var regexEscapeRE = /[-.*+?^${}()|[\\]\\/\\\\]/g;\n\n  var buildRegex = cached(function (delimiters) {\n    var open = delimiters[0].replace(regexEscapeRE, '\\\\$&');\n    var close = delimiters[1].replace(regexEscapeRE, '\\\\$&');\n    return new RegExp(open + '((?:.|\\\\n)+?)' + close, 'g')\n  });\n\n  function parseText (\n    text,\n    delimiters\n  ) {\n    var tagRE = delimiters ? buildRegex(delimiters) : defaultTagRE;\n    if (!tagRE.test(text)) {\n      return\n    }\n    var tokens = [];\n    var lastIndex = tagRE.lastIndex = 0;\n    var match, index;\n    while ((match = tagRE.exec(text))) {\n      index = match.index;\n      // push text token\n      if (index > lastIndex) {\n        tokens.push(JSON.stringify(text.slice(lastIndex, index)));\n      }\n      // tag token\n      var exp = parseFilters(match[1].trim());\n      tokens.push((\"_s(\" + exp + \")\"));\n      lastIndex = index + match[0].length;\n    }\n    if (lastIndex < text.length) {\n      tokens.push(JSON.stringify(text.slice(lastIndex)));\n    }\n    return tokens.join('+')\n  }\n\n  /*  */\n\n  var onRE = /^@|^v-on:/;\n  var dirRE = /^v-|^@|^:/;\n  var forAliasRE = /(.*?)\\s+(?:in|of)\\s+(.*)/;\n  var forIteratorRE = /\\((\\{[^}]*\\}|[^,]*),([^,]*)(?:,([^,]*))?\\)/;\n\n  var argRE = /:(.*)$/;\n  var bindRE = /^:|^v-bind:/;\n  var modifierRE = /\\.[^.]+/g;\n\n  var decodeHTMLCached = cached(decode);\n\n// configurable state\n  var warn$2;\n  var delimiters;\n  var transforms;\n  var preTransforms;\n  var postTransforms;\n  var platformIsPreTag;\n  var platformMustUseProp;\n  var platformGetTagNamespace;\n\n  /**\n   * Convert HTML string to AST.\n   */\n  function parse (\n    template,\n    options\n  ) {\n    warn$2 = options.warn || baseWarn;\n    platformGetTagNamespace = options.getTagNamespace || no;\n    platformMustUseProp = options.mustUseProp || no;\n    platformIsPreTag = options.isPreTag || no;\n    preTransforms = pluckModuleFunction(options.modules, 'preTransformNode');\n    transforms = pluckModuleFunction(options.modules, 'transformNode');\n    postTransforms = pluckModuleFunction(options.modules, 'postTransformNode');\n    delimiters = options.delimiters;\n\n    var stack = [];\n    var preserveWhitespace = options.preserveWhitespace !== false;\n    var root;\n    var currentParent;\n    var inVPre = false;\n    var inPre = false;\n    var warned = false;\n\n    function warnOnce (msg) {\n      if (!warned) {\n        warned = true;\n        warn$2(msg);\n      }\n    }\n\n    function endPre (element) {\n      // check pre state\n      if (element.pre) {\n        inVPre = false;\n      }\n      if (platformIsPreTag(element.tag)) {\n        inPre = false;\n      }\n    }\n\n    parseHTML(template, {\n      warn: warn$2,\n      expectHTML: options.expectHTML,\n      isUnaryTag: options.isUnaryTag,\n      shouldDecodeNewlines: options.shouldDecodeNewlines,\n      start: function start (tag, attrs, unary) {\n        // check namespace.\n        // inherit parent ns if there is one\n        var ns = (currentParent && currentParent.ns) || platformGetTagNamespace(tag);\n\n        // handle IE svg bug\n        /* istanbul ignore if */\n        if (isIE && ns === 'svg') {\n          attrs = guardIESVGBug(attrs);\n        }\n\n        var element = {\n          type: 1,\n          tag: tag,\n          attrsList: attrs,\n          attrsMap: makeAttrsMap(attrs),\n          parent: currentParent,\n          children: []\n        };\n        if (ns) {\n          element.ns = ns;\n        }\n\n        if (isForbiddenTag(element) && !isServerRendering()) {\n          element.forbidden = true;\n          \"development\" !== 'production' && warn$2(\n            'Templates should only be responsible for mapping the state to the ' +\n            'UI. Avoid placing tags with side-effects in your templates, such as ' +\n            \"<\" + tag + \">\" + ', as they will not be parsed.'\n          );\n        }\n\n        // apply pre-transforms\n        for (var i = 0; i < preTransforms.length; i++) {\n          preTransforms[i](element, options);\n        }\n\n        if (!inVPre) {\n          processPre(element);\n          if (element.pre) {\n            inVPre = true;\n          }\n        }\n        if (platformIsPreTag(element.tag)) {\n          inPre = true;\n        }\n        if (inVPre) {\n          processRawAttrs(element);\n        } else {\n          processFor(element);\n          processIf(element);\n          processOnce(element);\n          processKey(element);\n\n          // determine whether this is a plain element after\n          // removing structural attributes\n          element.plain = !element.key && !attrs.length;\n\n          processRef(element);\n          processSlot(element);\n          processComponent(element);\n          for (var i$1 = 0; i$1 < transforms.length; i$1++) {\n            transforms[i$1](element, options);\n          }\n          processAttrs(element);\n        }\n\n        function checkRootConstraints (el) {\n          {\n            if (el.tag === 'slot' || el.tag === 'template') {\n              warnOnce(\n                \"Cannot use <\" + (el.tag) + \"> as component root element because it may \" +\n                'contain multiple nodes.'\n              );\n            }\n            if (el.attrsMap.hasOwnProperty('v-for')) {\n              warnOnce(\n                'Cannot use v-for on stateful component root element because ' +\n                'it renders multiple elements.'\n              );\n            }\n          }\n        }\n\n        // tree management\n        if (!root) {\n          root = element;\n          checkRootConstraints(root);\n        } else if (!stack.length) {\n          // allow root elements with v-if, v-else-if and v-else\n          if (root.if && (element.elseif || element.else)) {\n            checkRootConstraints(element);\n            addIfCondition(root, {\n              exp: element.elseif,\n              block: element\n            });\n          } else {\n            warnOnce(\n              \"Component template should contain exactly one root element. \" +\n              \"If you are using v-if on multiple elements, \" +\n              \"use v-else-if to chain them instead.\"\n            );\n          }\n        }\n        if (currentParent && !element.forbidden) {\n          if (element.elseif || element.else) {\n            processIfConditions(element, currentParent);\n          } else if (element.slotScope) { // scoped slot\n            currentParent.plain = false;\n            var name = element.slotTarget || '\"default\"';(currentParent.scopedSlots || (currentParent.scopedSlots = {}))[name] = element;\n          } else {\n            currentParent.children.push(element);\n            element.parent = currentParent;\n          }\n        }\n        if (!unary) {\n          currentParent = element;\n          stack.push(element);\n        } else {\n          endPre(element);\n        }\n        // apply post-transforms\n        for (var i$2 = 0; i$2 < postTransforms.length; i$2++) {\n          postTransforms[i$2](element, options);\n        }\n      },\n\n      end: function end () {\n        // remove trailing whitespace\n        var element = stack[stack.length - 1];\n        var lastNode = element.children[element.children.length - 1];\n        if (lastNode && lastNode.type === 3 && lastNode.text === ' ' && !inPre) {\n          element.children.pop();\n        }\n        // pop stack\n        stack.length -= 1;\n        currentParent = stack[stack.length - 1];\n        endPre(element);\n      },\n\n      chars: function chars (text) {\n        if (!currentParent) {\n          {\n            if (text === template) {\n              warnOnce(\n                'Component template requires a root element, rather than just text.'\n              );\n            } else if ((text = text.trim())) {\n              warnOnce(\n                (\"text \\\"\" + text + \"\\\" outside root element will be ignored.\")\n              );\n            }\n          }\n          return\n        }\n        // IE textarea placeholder bug\n        /* istanbul ignore if */\n        if (isIE &&\n          currentParent.tag === 'textarea' &&\n          currentParent.attrsMap.placeholder === text) {\n          return\n        }\n        var children = currentParent.children;\n        text = inPre || text.trim()\n          ? decodeHTMLCached(text)\n          // only preserve whitespace if its not right after a starting tag\n          : preserveWhitespace && children.length ? ' ' : '';\n        if (text) {\n          var expression;\n          if (!inVPre && text !== ' ' && (expression = parseText(text, delimiters))) {\n            children.push({\n              type: 2,\n              expression: expression,\n              text: text\n            });\n          } else if (text !== ' ' || !children.length || children[children.length - 1].text !== ' ') {\n            children.push({\n              type: 3,\n              text: text\n            });\n          }\n        }\n      }\n    });\n    return root\n  }\n\n  function processPre (el) {\n    if (getAndRemoveAttr(el, 'v-pre') != null) {\n      el.pre = true;\n    }\n  }\n\n  function processRawAttrs (el) {\n    var l = el.attrsList.length;\n    if (l) {\n      var attrs = el.attrs = new Array(l);\n      for (var i = 0; i < l; i++) {\n        attrs[i] = {\n          name: el.attrsList[i].name,\n          value: JSON.stringify(el.attrsList[i].value)\n        };\n      }\n    } else if (!el.pre) {\n      // non root node in pre blocks with no attributes\n      el.plain = true;\n    }\n  }\n\n  function processKey (el) {\n    var exp = getBindingAttr(el, 'key');\n    if (exp) {\n      if (\"development\" !== 'production' && el.tag === 'template') {\n        warn$2(\"<template> cannot be keyed. Place the key on real elements instead.\");\n      }\n      el.key = exp;\n    }\n  }\n\n  function processRef (el) {\n    var ref = getBindingAttr(el, 'ref');\n    if (ref) {\n      el.ref = ref;\n      el.refInFor = checkInFor(el);\n    }\n  }\n\n  function processFor (el) {\n    var exp;\n    if ((exp = getAndRemoveAttr(el, 'v-for'))) {\n      var inMatch = exp.match(forAliasRE);\n      if (!inMatch) {\n        \"development\" !== 'production' && warn$2(\n          (\"Invalid v-for expression: \" + exp)\n        );\n        return\n      }\n      el.for = inMatch[2].trim();\n      var alias = inMatch[1].trim();\n      var iteratorMatch = alias.match(forIteratorRE);\n      if (iteratorMatch) {\n        el.alias = iteratorMatch[1].trim();\n        el.iterator1 = iteratorMatch[2].trim();\n        if (iteratorMatch[3]) {\n          el.iterator2 = iteratorMatch[3].trim();\n        }\n      } else {\n        el.alias = alias;\n      }\n    }\n  }\n\n  function processIf (el) {\n    var exp = getAndRemoveAttr(el, 'v-if');\n    if (exp) {\n      el.if = exp;\n      addIfCondition(el, {\n        exp: exp,\n        block: el\n      });\n    } else {\n      if (getAndRemoveAttr(el, 'v-else') != null) {\n        el.else = true;\n      }\n      var elseif = getAndRemoveAttr(el, 'v-else-if');\n      if (elseif) {\n        el.elseif = elseif;\n      }\n    }\n  }\n\n  function processIfConditions (el, parent) {\n    var prev = findPrevElement(parent.children);\n    if (prev && prev.if) {\n      addIfCondition(prev, {\n        exp: el.elseif,\n        block: el\n      });\n    } else {\n      warn$2(\n        \"v-\" + (el.elseif ? ('else-if=\"' + el.elseif + '\"') : 'else') + \" \" +\n        \"used on element <\" + (el.tag) + \"> without corresponding v-if.\"\n      );\n    }\n  }\n\n  function findPrevElement (children) {\n    var i = children.length;\n    while (i--) {\n      if (children[i].type === 1) {\n        return children[i]\n      } else {\n        if (\"development\" !== 'production' && children[i].text !== ' ') {\n          warn$2(\n            \"text \\\"\" + (children[i].text.trim()) + \"\\\" between v-if and v-else(-if) \" +\n            \"will be ignored.\"\n          );\n        }\n        children.pop();\n      }\n    }\n  }\n\n  function addIfCondition (el, condition) {\n    if (!el.ifConditions) {\n      el.ifConditions = [];\n    }\n    el.ifConditions.push(condition);\n  }\n\n  function processOnce (el) {\n    var once$$1 = getAndRemoveAttr(el, 'v-once');\n    if (once$$1 != null) {\n      el.once = true;\n    }\n  }\n\n  function processSlot (el) {\n    if (el.tag === 'slot') {\n      el.slotName = getBindingAttr(el, 'name');\n      if (\"development\" !== 'production' && el.key) {\n        warn$2(\n          \"`key` does not work on <slot> because slots are abstract outlets \" +\n          \"and can possibly expand into multiple elements. \" +\n          \"Use the key on a wrapping element instead.\"\n        );\n      }\n    } else {\n      var slotTarget = getBindingAttr(el, 'slot');\n      if (slotTarget) {\n        el.slotTarget = slotTarget === '\"\"' ? '\"default\"' : slotTarget;\n      }\n      if (el.tag === 'template') {\n        el.slotScope = getAndRemoveAttr(el, 'scope');\n      }\n    }\n  }\n\n  function processComponent (el) {\n    var binding;\n    if ((binding = getBindingAttr(el, 'is'))) {\n      el.component = binding;\n    }\n    if (getAndRemoveAttr(el, 'inline-template') != null) {\n      el.inlineTemplate = true;\n    }\n  }\n\n  function processAttrs (el) {\n    var list = el.attrsList;\n    var i, l, name, rawName, value, modifiers, isProp;\n    for (i = 0, l = list.length; i < l; i++) {\n      name = rawName = list[i].name;\n      value = list[i].value;\n      if (dirRE.test(name)) {\n        // mark element as dynamic\n        el.hasBindings = true;\n        // modifiers\n        modifiers = parseModifiers(name);\n        if (modifiers) {\n          name = name.replace(modifierRE, '');\n        }\n        if (bindRE.test(name)) { // v-bind\n          name = name.replace(bindRE, '');\n          value = parseFilters(value);\n          isProp = false;\n          if (modifiers) {\n            if (modifiers.prop) {\n              isProp = true;\n              name = camelize(name);\n              if (name === 'innerHtml') { name = 'innerHTML'; }\n            }\n            if (modifiers.camel) {\n              name = camelize(name);\n            }\n          }\n          if (isProp || platformMustUseProp(el.tag, el.attrsMap.type, name)) {\n            addProp(el, name, value);\n          } else {\n            addAttr(el, name, value);\n          }\n        } else if (onRE.test(name)) { // v-on\n          name = name.replace(onRE, '');\n          addHandler(el, name, value, modifiers);\n        } else { // normal directives\n          name = name.replace(dirRE, '');\n          // parse arg\n          var argMatch = name.match(argRE);\n          var arg = argMatch && argMatch[1];\n          if (arg) {\n            name = name.slice(0, -(arg.length + 1));\n          }\n          addDirective(el, name, rawName, value, arg, modifiers);\n          if (\"development\" !== 'production' && name === 'model') {\n            checkForAliasModel(el, value);\n          }\n        }\n      } else {\n        // literal attribute\n        {\n          var expression = parseText(value, delimiters);\n          if (expression) {\n            warn$2(\n              name + \"=\\\"\" + value + \"\\\": \" +\n              'Interpolation inside attributes has been removed. ' +\n              'Use v-bind or the colon shorthand instead. For example, ' +\n              'instead of <div id=\"{{ val }}\">, use <div :id=\"val\">.'\n            );\n          }\n        }\n        addAttr(el, name, JSON.stringify(value));\n      }\n    }\n  }\n\n  function checkInFor (el) {\n    var parent = el;\n    while (parent) {\n      if (parent.for !== undefined) {\n        return true\n      }\n      parent = parent.parent;\n    }\n    return false\n  }\n\n  function parseModifiers (name) {\n    var match = name.match(modifierRE);\n    if (match) {\n      var ret = {};\n      match.forEach(function (m) { ret[m.slice(1)] = true; });\n      return ret\n    }\n  }\n\n  function makeAttrsMap (attrs) {\n    var map = {};\n    for (var i = 0, l = attrs.length; i < l; i++) {\n      if (\"development\" !== 'production' && map[attrs[i].name] && !isIE) {\n        warn$2('duplicate attribute: ' + attrs[i].name);\n      }\n      map[attrs[i].name] = attrs[i].value;\n    }\n    return map\n  }\n\n  function isForbiddenTag (el) {\n    return (\n      el.tag === 'style' ||\n      (el.tag === 'script' && (\n        !el.attrsMap.type ||\n        el.attrsMap.type === 'text/javascript'\n      ))\n    )\n  }\n\n  var ieNSBug = /^xmlns:NS\\d+/;\n  var ieNSPrefix = /^NS\\d+:/;\n\n  /* istanbul ignore next */\n  function guardIESVGBug (attrs) {\n    var res = [];\n    for (var i = 0; i < attrs.length; i++) {\n      var attr = attrs[i];\n      if (!ieNSBug.test(attr.name)) {\n        attr.name = attr.name.replace(ieNSPrefix, '');\n        res.push(attr);\n      }\n    }\n    return res\n  }\n\n  function checkForAliasModel (el, value) {\n    var _el = el;\n    while (_el) {\n      if (_el.for && _el.alias === value) {\n        warn$2(\n          \"<\" + (el.tag) + \" v-model=\\\"\" + value + \"\\\">: \" +\n          \"You are binding v-model directly to a v-for iteration alias. \" +\n          \"This will not be able to modify the v-for source array because \" +\n          \"writing to the alias is like modifying a function local variable. \" +\n          \"Consider using an array of objects and use v-model on an object property instead.\"\n        );\n      }\n      _el = _el.parent;\n    }\n  }\n\n  /*  */\n\n  var isStaticKey;\n  var isPlatformReservedTag;\n\n  var genStaticKeysCached = cached(genStaticKeys$1);\n\n  /**\n   * Goal of the optimizer: walk the generated template AST tree\n   * and detect sub-trees that are purely static, i.e. parts of\n   * the DOM that never needs to change.\n   *\n   * Once we detect these sub-trees, we can:\n   *\n   * 1. Hoist them into constants, so that we no longer need to\n   *    create fresh nodes for them on each re-render;\n   * 2. Completely skip them in the patching process.\n   */\n  function optimize (root, options) {\n    if (!root) { return }\n    isStaticKey = genStaticKeysCached(options.staticKeys || '');\n    isPlatformReservedTag = options.isReservedTag || no;\n    // first pass: mark all non-static nodes.\n    markStatic$1(root);\n    // second pass: mark static roots.\n    markStaticRoots(root, false);\n  }\n\n  function genStaticKeys$1 (keys) {\n    return makeMap(\n      'type,tag,attrsList,attrsMap,plain,parent,children,attrs' +\n      (keys ? ',' + keys : '')\n    )\n  }\n\n  function markStatic$1 (node) {\n    node.static = isStatic(node);\n    if (node.type === 1) {\n      // do not make component slot content static. this avoids\n      // 1. components not able to mutate slot nodes\n      // 2. static slot content fails for hot-reloading\n      if (\n        !isPlatformReservedTag(node.tag) &&\n        node.tag !== 'slot' &&\n        node.attrsMap['inline-template'] == null\n      ) {\n        return\n      }\n      for (var i = 0, l = node.children.length; i < l; i++) {\n        var child = node.children[i];\n        markStatic$1(child);\n        if (!child.static) {\n          node.static = false;\n        }\n      }\n    }\n  }\n\n  function markStaticRoots (node, isInFor) {\n    if (node.type === 1) {\n      if (node.static || node.once) {\n        node.staticInFor = isInFor;\n      }\n      // For a node to qualify as a static root, it should have children that\n      // are not just static text. Otherwise the cost of hoisting out will\n      // outweigh the benefits and it's better off to just always render it fresh.\n      if (node.static && node.children.length && !(\n          node.children.length === 1 &&\n          node.children[0].type === 3\n        )) {\n        node.staticRoot = true;\n        return\n      } else {\n        node.staticRoot = false;\n      }\n      if (node.children) {\n        for (var i = 0, l = node.children.length; i < l; i++) {\n          markStaticRoots(node.children[i], isInFor || !!node.for);\n        }\n      }\n      if (node.ifConditions) {\n        walkThroughConditionsBlocks(node.ifConditions, isInFor);\n      }\n    }\n  }\n\n  function walkThroughConditionsBlocks (conditionBlocks, isInFor) {\n    for (var i = 1, len = conditionBlocks.length; i < len; i++) {\n      markStaticRoots(conditionBlocks[i].block, isInFor);\n    }\n  }\n\n  function isStatic (node) {\n    if (node.type === 2) { // expression\n      return false\n    }\n    if (node.type === 3) { // text\n      return true\n    }\n    return !!(node.pre || (\n      !node.hasBindings && // no dynamic bindings\n      !node.if && !node.for && // not v-if or v-for or v-else\n      !isBuiltInTag(node.tag) && // not a built-in\n      isPlatformReservedTag(node.tag) && // not a component\n      !isDirectChildOfTemplateFor(node) &&\n      Object.keys(node).every(isStaticKey)\n    ))\n  }\n\n  function isDirectChildOfTemplateFor (node) {\n    while (node.parent) {\n      node = node.parent;\n      if (node.tag !== 'template') {\n        return false\n      }\n      if (node.for) {\n        return true\n      }\n    }\n    return false\n  }\n\n  /*  */\n\n  var fnExpRE = /^\\s*([\\w$_]+|\\([^)]*?\\))\\s*=>|^function\\s*\\(/;\n  var simplePathRE = /^\\s*[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*|\\['.*?']|\\[\".*?\"]|\\[\\d+]|\\[[A-Za-z_$][\\w$]*])*\\s*$/;\n\n// keyCode aliases\n  var keyCodes = {\n    esc: 27,\n    tab: 9,\n    enter: 13,\n    space: 32,\n    up: 38,\n    left: 37,\n    right: 39,\n    down: 40,\n    'delete': [8, 46]\n  };\n\n// #4868: modifiers that prevent the execution of the listener\n// need to explicitly return null so that we can determine whether to remove\n// the listener for .once\n  var genGuard = function (condition) { return (\"if(\" + condition + \")return null;\"); };\n\n  var modifierCode = {\n    stop: '$event.stopPropagation();',\n    prevent: '$event.preventDefault();',\n    self: genGuard(\"$event.target !== $event.currentTarget\"),\n    ctrl: genGuard(\"!$event.ctrlKey\"),\n    shift: genGuard(\"!$event.shiftKey\"),\n    alt: genGuard(\"!$event.altKey\"),\n    meta: genGuard(\"!$event.metaKey\"),\n    left: genGuard(\"'button' in $event && $event.button !== 0\"),\n    middle: genGuard(\"'button' in $event && $event.button !== 1\"),\n    right: genGuard(\"'button' in $event && $event.button !== 2\")\n  };\n\n  function genHandlers (events, native) {\n    var res = native ? 'nativeOn:{' : 'on:{';\n    for (var name in events) {\n      res += \"\\\"\" + name + \"\\\":\" + (genHandler(name, events[name])) + \",\";\n    }\n    return res.slice(0, -1) + '}'\n  }\n\n  function genHandler (\n    name,\n    handler\n  ) {\n    if (!handler) {\n      return 'function(){}'\n    }\n\n    if (Array.isArray(handler)) {\n      return (\"[\" + (handler.map(function (handler) { return genHandler(name, handler); }).join(',')) + \"]\")\n    }\n\n    var isMethodPath = simplePathRE.test(handler.value);\n    var isFunctionExpression = fnExpRE.test(handler.value);\n\n    if (!handler.modifiers) {\n      return isMethodPath || isFunctionExpression\n        ? handler.value\n        : (\"function($event){\" + (handler.value) + \"}\") // inline statement\n    } else {\n      var code = '';\n      var genModifierCode = '';\n      var keys = [];\n      for (var key in handler.modifiers) {\n        if (modifierCode[key]) {\n          genModifierCode += modifierCode[key];\n          // left/right\n          if (keyCodes[key]) {\n            keys.push(key);\n          }\n        } else {\n          keys.push(key);\n        }\n      }\n      if (keys.length) {\n        code += genKeyFilter(keys);\n      }\n      // Make sure modifiers like prevent and stop get executed after key filtering\n      if (genModifierCode) {\n        code += genModifierCode;\n      }\n      var handlerCode = isMethodPath\n        ? handler.value + '($event)'\n        : isFunctionExpression\n          ? (\"(\" + (handler.value) + \")($event)\")\n          : handler.value;\n      return (\"function($event){\" + code + handlerCode + \"}\")\n    }\n  }\n\n  function genKeyFilter (keys) {\n    return (\"if(!('button' in $event)&&\" + (keys.map(genFilterCode).join('&&')) + \")return null;\")\n  }\n\n  function genFilterCode (key) {\n    var keyVal = parseInt(key, 10);\n    if (keyVal) {\n      return (\"$event.keyCode!==\" + keyVal)\n    }\n    var alias = keyCodes[key];\n    return (\"_k($event.keyCode,\" + (JSON.stringify(key)) + (alias ? ',' + JSON.stringify(alias) : '') + \")\")\n  }\n\n  /*  */\n\n  function bind$1 (el, dir) {\n    el.wrapData = function (code) {\n      return (\"_b(\" + code + \",'\" + (el.tag) + \"',\" + (dir.value) + (dir.modifiers && dir.modifiers.prop ? ',true' : '') + \")\")\n    };\n  }\n\n  /*  */\n\n  var baseDirectives = {\n    bind: bind$1,\n    cloak: noop\n  };\n\n  /*  */\n\n// configurable state\n  var warn$3;\n  var transforms$1;\n  var dataGenFns;\n  var platformDirectives$1;\n  var isPlatformReservedTag$1;\n  var staticRenderFns;\n  var onceCount;\n  var currentOptions;\n\n  function generate (\n    ast,\n    options\n  ) {\n    // save previous staticRenderFns so generate calls can be nested\n    var prevStaticRenderFns = staticRenderFns;\n    var currentStaticRenderFns = staticRenderFns = [];\n    var prevOnceCount = onceCount;\n    onceCount = 0;\n    currentOptions = options;\n    warn$3 = options.warn || baseWarn;\n    transforms$1 = pluckModuleFunction(options.modules, 'transformCode');\n    dataGenFns = pluckModuleFunction(options.modules, 'genData');\n    platformDirectives$1 = options.directives || {};\n    isPlatformReservedTag$1 = options.isReservedTag || no;\n    var code = ast ? genElement(ast) : '_c(\"div\")';\n    staticRenderFns = prevStaticRenderFns;\n    onceCount = prevOnceCount;\n    return {\n      render: (\"with(this){return \" + code + \"}\"),\n      staticRenderFns: currentStaticRenderFns\n    }\n  }\n\n  function genElement (el) {\n    if (el.staticRoot && !el.staticProcessed) {\n      return genStatic(el)\n    } else if (el.once && !el.onceProcessed) {\n      return genOnce(el)\n    } else if (el.for && !el.forProcessed) {\n      return genFor(el)\n    } else if (el.if && !el.ifProcessed) {\n      return genIf(el)\n    } else if (el.tag === 'template' && !el.slotTarget) {\n      return genChildren(el) || 'void 0'\n    } else if (el.tag === 'slot') {\n      return genSlot(el)\n    } else {\n      // component or element\n      var code;\n      if (el.component) {\n        code = genComponent(el.component, el);\n      } else {\n        var data = el.plain ? undefined : genData(el);\n\n        var children = el.inlineTemplate ? null : genChildren(el, true);\n        code = \"_c('\" + (el.tag) + \"'\" + (data ? (\",\" + data) : '') + (children ? (\",\" + children) : '') + \")\";\n      }\n      // module transforms\n      for (var i = 0; i < transforms$1.length; i++) {\n        code = transforms$1[i](el, code);\n      }\n      return code\n    }\n  }\n\n// hoist static sub-trees out\n  function genStatic (el) {\n    el.staticProcessed = true;\n    staticRenderFns.push((\"with(this){return \" + (genElement(el)) + \"}\"));\n    return (\"_m(\" + (staticRenderFns.length - 1) + (el.staticInFor ? ',true' : '') + \")\")\n  }\n\n// v-once\n  function genOnce (el) {\n    el.onceProcessed = true;\n    if (el.if && !el.ifProcessed) {\n      return genIf(el)\n    } else if (el.staticInFor) {\n      var key = '';\n      var parent = el.parent;\n      while (parent) {\n        if (parent.for) {\n          key = parent.key;\n          break\n        }\n        parent = parent.parent;\n      }\n      if (!key) {\n        \"development\" !== 'production' && warn$3(\n          \"v-once can only be used inside v-for that is keyed. \"\n        );\n        return genElement(el)\n      }\n      return (\"_o(\" + (genElement(el)) + \",\" + (onceCount++) + (key ? (\",\" + key) : \"\") + \")\")\n    } else {\n      return genStatic(el)\n    }\n  }\n\n  function genIf (el) {\n    el.ifProcessed = true; // avoid recursion\n    return genIfConditions(el.ifConditions.slice())\n  }\n\n  function genIfConditions (conditions) {\n    if (!conditions.length) {\n      return '_e()'\n    }\n\n    var condition = conditions.shift();\n    if (condition.exp) {\n      return (\"(\" + (condition.exp) + \")?\" + (genTernaryExp(condition.block)) + \":\" + (genIfConditions(conditions)))\n    } else {\n      return (\"\" + (genTernaryExp(condition.block)))\n    }\n\n    // v-if with v-once should generate code like (a)?_m(0):_m(1)\n    function genTernaryExp (el) {\n      return el.once ? genOnce(el) : genElement(el)\n    }\n  }\n\n  function genFor (el) {\n    var exp = el.for;\n    var alias = el.alias;\n    var iterator1 = el.iterator1 ? (\",\" + (el.iterator1)) : '';\n    var iterator2 = el.iterator2 ? (\",\" + (el.iterator2)) : '';\n\n    if (\n      \"development\" !== 'production' &&\n      maybeComponent(el) && el.tag !== 'slot' && el.tag !== 'template' && !el.key\n    ) {\n      warn$3(\n        \"<\" + (el.tag) + \" v-for=\\\"\" + alias + \" in \" + exp + \"\\\">: component lists rendered with \" +\n        \"v-for should have explicit keys. \" +\n        \"See https://vuejs.org/guide/list.html#key for more info.\",\n        true /* tip */\n      );\n    }\n\n    el.forProcessed = true; // avoid recursion\n    return \"_l((\" + exp + \"),\" +\n      \"function(\" + alias + iterator1 + iterator2 + \"){\" +\n      \"return \" + (genElement(el)) +\n      '})'\n  }\n\n  function genData (el) {\n    var data = '{';\n\n    // directives first.\n    // directives may mutate the el's other properties before they are generated.\n    var dirs = genDirectives(el);\n    if (dirs) { data += dirs + ','; }\n\n    // key\n    if (el.key) {\n      data += \"key:\" + (el.key) + \",\";\n    }\n    // ref\n    if (el.ref) {\n      data += \"ref:\" + (el.ref) + \",\";\n    }\n    if (el.refInFor) {\n      data += \"refInFor:true,\";\n    }\n    // pre\n    if (el.pre) {\n      data += \"pre:true,\";\n    }\n    // record original tag name for components using \"is\" attribute\n    if (el.component) {\n      data += \"tag:\\\"\" + (el.tag) + \"\\\",\";\n    }\n    // module data generation functions\n    for (var i = 0; i < dataGenFns.length; i++) {\n      data += dataGenFns[i](el);\n    }\n    // attributes\n    if (el.attrs) {\n      data += \"attrs:{\" + (genProps(el.attrs)) + \"},\";\n    }\n    // DOM props\n    if (el.props) {\n      data += \"domProps:{\" + (genProps(el.props)) + \"},\";\n    }\n    // event handlers\n    if (el.events) {\n      data += (genHandlers(el.events)) + \",\";\n    }\n    if (el.nativeEvents) {\n      data += (genHandlers(el.nativeEvents, true)) + \",\";\n    }\n    // slot target\n    if (el.slotTarget) {\n      data += \"slot:\" + (el.slotTarget) + \",\";\n    }\n    // scoped slots\n    if (el.scopedSlots) {\n      data += (genScopedSlots(el.scopedSlots)) + \",\";\n    }\n    // component v-model\n    if (el.model) {\n      data += \"model:{value:\" + (el.model.value) + \",callback:\" + (el.model.callback) + \",expression:\" + (el.model.expression) + \"},\";\n    }\n    // inline-template\n    if (el.inlineTemplate) {\n      var inlineTemplate = genInlineTemplate(el);\n      if (inlineTemplate) {\n        data += inlineTemplate + \",\";\n      }\n    }\n    data = data.replace(/,$/, '') + '}';\n    // v-bind data wrap\n    if (el.wrapData) {\n      data = el.wrapData(data);\n    }\n    return data\n  }\n\n  function genDirectives (el) {\n    var dirs = el.directives;\n    if (!dirs) { return }\n    var res = 'directives:[';\n    var hasRuntime = false;\n    var i, l, dir, needRuntime;\n    for (i = 0, l = dirs.length; i < l; i++) {\n      dir = dirs[i];\n      needRuntime = true;\n      var gen = platformDirectives$1[dir.name] || baseDirectives[dir.name];\n      if (gen) {\n        // compile-time directive that manipulates AST.\n        // returns true if it also needs a runtime counterpart.\n        needRuntime = !!gen(el, dir, warn$3);\n      }\n      if (needRuntime) {\n        hasRuntime = true;\n        res += \"{name:\\\"\" + (dir.name) + \"\\\",rawName:\\\"\" + (dir.rawName) + \"\\\"\" + (dir.value ? (\",value:(\" + (dir.value) + \"),expression:\" + (JSON.stringify(dir.value))) : '') + (dir.arg ? (\",arg:\\\"\" + (dir.arg) + \"\\\"\") : '') + (dir.modifiers ? (\",modifiers:\" + (JSON.stringify(dir.modifiers))) : '') + \"},\";\n      }\n    }\n    if (hasRuntime) {\n      return res.slice(0, -1) + ']'\n    }\n  }\n\n  function genInlineTemplate (el) {\n    var ast = el.children[0];\n    if (\"development\" !== 'production' && (\n        el.children.length > 1 || ast.type !== 1\n      )) {\n      warn$3('Inline-template components must have exactly one child element.');\n    }\n    if (ast.type === 1) {\n      var inlineRenderFns = generate(ast, currentOptions);\n      return (\"inlineTemplate:{render:function(){\" + (inlineRenderFns.render) + \"},staticRenderFns:[\" + (inlineRenderFns.staticRenderFns.map(function (code) { return (\"function(){\" + code + \"}\"); }).join(',')) + \"]}\")\n    }\n  }\n\n  function genScopedSlots (slots) {\n    return (\"scopedSlots:_u([\" + (Object.keys(slots).map(function (key) { return genScopedSlot(key, slots[key]); }).join(',')) + \"])\")\n  }\n\n  function genScopedSlot (key, el) {\n    return \"[\" + key + \",function(\" + (String(el.attrsMap.scope)) + \"){\" +\n      \"return \" + (el.tag === 'template'\n        ? genChildren(el) || 'void 0'\n        : genElement(el)) + \"}]\"\n  }\n\n  function genChildren (el, checkSkip) {\n    var children = el.children;\n    if (children.length) {\n      var el$1 = children[0];\n      // optimize single v-for\n      if (children.length === 1 &&\n        el$1.for &&\n        el$1.tag !== 'template' &&\n        el$1.tag !== 'slot') {\n        return genElement(el$1)\n      }\n      var normalizationType = checkSkip ? getNormalizationType(children) : 0;\n      return (\"[\" + (children.map(genNode).join(',')) + \"]\" + (normalizationType ? (\",\" + normalizationType) : ''))\n    }\n  }\n\n// determine the normalization needed for the children array.\n// 0: no normalization needed\n// 1: simple normalization needed (possible 1-level deep nested array)\n// 2: full normalization needed\n  function getNormalizationType (children) {\n    var res = 0;\n    for (var i = 0; i < children.length; i++) {\n      var el = children[i];\n      if (el.type !== 1) {\n        continue\n      }\n      if (needsNormalization(el) ||\n        (el.ifConditions && el.ifConditions.some(function (c) { return needsNormalization(c.block); }))) {\n        res = 2;\n        break\n      }\n      if (maybeComponent(el) ||\n        (el.ifConditions && el.ifConditions.some(function (c) { return maybeComponent(c.block); }))) {\n        res = 1;\n      }\n    }\n    return res\n  }\n\n  function needsNormalization (el) {\n    return el.for !== undefined || el.tag === 'template' || el.tag === 'slot'\n  }\n\n  function maybeComponent (el) {\n    return !isPlatformReservedTag$1(el.tag)\n  }\n\n  function genNode (node) {\n    if (node.type === 1) {\n      return genElement(node)\n    } else {\n      return genText(node)\n    }\n  }\n\n  function genText (text) {\n    return (\"_v(\" + (text.type === 2\n      ? text.expression // no need for () because already wrapped in _s()\n      : transformSpecialNewlines(JSON.stringify(text.text))) + \")\")\n  }\n\n  function genSlot (el) {\n    var slotName = el.slotName || '\"default\"';\n    var children = genChildren(el);\n    var res = \"_t(\" + slotName + (children ? (\",\" + children) : '');\n    var attrs = el.attrs && (\"{\" + (el.attrs.map(function (a) { return ((camelize(a.name)) + \":\" + (a.value)); }).join(',')) + \"}\");\n    var bind$$1 = el.attrsMap['v-bind'];\n    if ((attrs || bind$$1) && !children) {\n      res += \",null\";\n    }\n    if (attrs) {\n      res += \",\" + attrs;\n    }\n    if (bind$$1) {\n      res += (attrs ? '' : ',null') + \",\" + bind$$1;\n    }\n    return res + ')'\n  }\n\n// componentName is el.component, take it as argument to shun flow's pessimistic refinement\n  function genComponent (componentName, el) {\n    var children = el.inlineTemplate ? null : genChildren(el, true);\n    return (\"_c(\" + componentName + \",\" + (genData(el)) + (children ? (\",\" + children) : '') + \")\")\n  }\n\n  function genProps (props) {\n    var res = '';\n    for (var i = 0; i < props.length; i++) {\n      var prop = props[i];\n      res += \"\\\"\" + (prop.name) + \"\\\":\" + (transformSpecialNewlines(prop.value)) + \",\";\n    }\n    return res.slice(0, -1)\n  }\n\n// #3895, #4268\n  function transformSpecialNewlines (text) {\n    return text\n      .replace(/\\u2028/g, '\\\\u2028')\n      .replace(/\\u2029/g, '\\\\u2029')\n  }\n\n  /*  */\n\n// these keywords should not appear inside expressions, but operators like\n// typeof, instanceof and in are allowed\n  var prohibitedKeywordRE = new RegExp('\\\\b' + (\n      'do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,' +\n      'super,throw,while,yield,delete,export,import,return,switch,default,' +\n      'extends,finally,continue,debugger,function,arguments'\n    ).split(',').join('\\\\b|\\\\b') + '\\\\b');\n\n// these unary operators should not be used as property/method names\n  var unaryOperatorsRE = new RegExp('\\\\b' + (\n      'delete,typeof,void'\n    ).split(',').join('\\\\s*\\\\([^\\\\)]*\\\\)|\\\\b') + '\\\\s*\\\\([^\\\\)]*\\\\)');\n\n// check valid identifier for v-for\n  var identRE = /[A-Za-z_$][\\w$]*/;\n\n// strip strings in expressions\n  var stripStringRE = /'(?:[^'\\\\]|\\\\.)*'|\"(?:[^\"\\\\]|\\\\.)*\"|`(?:[^`\\\\]|\\\\.)*\\$\\{|\\}(?:[^`\\\\]|\\\\.)*`|`(?:[^`\\\\]|\\\\.)*`/g;\n\n// detect problematic expressions in a template\n  function detectErrors (ast) {\n    var errors = [];\n    if (ast) {\n      checkNode(ast, errors);\n    }\n    return errors\n  }\n\n  function checkNode (node, errors) {\n    if (node.type === 1) {\n      for (var name in node.attrsMap) {\n        if (dirRE.test(name)) {\n          var value = node.attrsMap[name];\n          if (value) {\n            if (name === 'v-for') {\n              checkFor(node, (\"v-for=\\\"\" + value + \"\\\"\"), errors);\n            } else if (onRE.test(name)) {\n              checkEvent(value, (name + \"=\\\"\" + value + \"\\\"\"), errors);\n            } else {\n              checkExpression(value, (name + \"=\\\"\" + value + \"\\\"\"), errors);\n            }\n          }\n        }\n      }\n      if (node.children) {\n        for (var i = 0; i < node.children.length; i++) {\n          checkNode(node.children[i], errors);\n        }\n      }\n    } else if (node.type === 2) {\n      checkExpression(node.expression, node.text, errors);\n    }\n  }\n\n  function checkEvent (exp, text, errors) {\n    var keywordMatch = exp.replace(stripStringRE, '').match(unaryOperatorsRE);\n    if (keywordMatch) {\n      errors.push(\n        \"avoid using JavaScript unary operator as property name: \" +\n        \"\\\"\" + (keywordMatch[0]) + \"\\\" in expression \" + (text.trim())\n      );\n    }\n    checkExpression(exp, text, errors);\n  }\n\n  function checkFor (node, text, errors) {\n    checkExpression(node.for || '', text, errors);\n    checkIdentifier(node.alias, 'v-for alias', text, errors);\n    checkIdentifier(node.iterator1, 'v-for iterator', text, errors);\n    checkIdentifier(node.iterator2, 'v-for iterator', text, errors);\n  }\n\n  function checkIdentifier (ident, type, text, errors) {\n    if (typeof ident === 'string' && !identRE.test(ident)) {\n      errors.push((\"invalid \" + type + \" \\\"\" + ident + \"\\\" in expression: \" + (text.trim())));\n    }\n  }\n\n  function checkExpression (exp, text, errors) {\n    try {\n      new Function((\"return \" + exp));\n    } catch (e) {\n      var keywordMatch = exp.replace(stripStringRE, '').match(prohibitedKeywordRE);\n      if (keywordMatch) {\n        errors.push(\n          \"avoid using JavaScript keyword as property name: \" +\n          \"\\\"\" + (keywordMatch[0]) + \"\\\" in expression \" + (text.trim())\n        );\n      } else {\n        errors.push((\"invalid expression: \" + (text.trim())));\n      }\n    }\n  }\n\n  /*  */\n\n  function baseCompile (\n    template,\n    options\n  ) {\n    var ast = parse(template.trim(), options);\n    optimize(ast, options);\n    var code = generate(ast, options);\n    return {\n      ast: ast,\n      render: code.render,\n      staticRenderFns: code.staticRenderFns\n    }\n  }\n\n  function makeFunction (code, errors) {\n    try {\n      return new Function(code)\n    } catch (err) {\n      errors.push({ err: err, code: code });\n      return noop\n    }\n  }\n\n  function createCompiler (baseOptions) {\n    var functionCompileCache = Object.create(null);\n\n    function compile (\n      template,\n      options\n    ) {\n      var finalOptions = Object.create(baseOptions);\n      var errors = [];\n      var tips = [];\n      finalOptions.warn = function (msg, tip$$1) {\n        (tip$$1 ? tips : errors).push(msg);\n      };\n\n      if (options) {\n        // merge custom modules\n        if (options.modules) {\n          finalOptions.modules = (baseOptions.modules || []).concat(options.modules);\n        }\n        // merge custom directives\n        if (options.directives) {\n          finalOptions.directives = extend(\n            Object.create(baseOptions.directives),\n            options.directives\n          );\n        }\n        // copy other options\n        for (var key in options) {\n          if (key !== 'modules' && key !== 'directives') {\n            finalOptions[key] = options[key];\n          }\n        }\n      }\n\n      var compiled = baseCompile(template, finalOptions);\n      {\n        errors.push.apply(errors, detectErrors(compiled.ast));\n      }\n      compiled.errors = errors;\n      compiled.tips = tips;\n      return compiled\n    }\n\n    function compileToFunctions (\n      template,\n      options,\n      vm\n    ) {\n      options = options || {};\n\n      /* istanbul ignore if */\n      {\n        // detect possible CSP restriction\n        try {\n          new Function('return 1');\n        } catch (e) {\n          if (e.toString().match(/unsafe-eval|CSP/)) {\n            warn(\n              'It seems you are using the standalone build of Vue.js in an ' +\n              'environment with Content Security Policy that prohibits unsafe-eval. ' +\n              'The template compiler cannot work in this environment. Consider ' +\n              'relaxing the policy to allow unsafe-eval or pre-compiling your ' +\n              'templates into render functions.'\n            );\n          }\n        }\n      }\n\n      // check cache\n      var key = options.delimiters\n        ? String(options.delimiters) + template\n        : template;\n      if (functionCompileCache[key]) {\n        return functionCompileCache[key]\n      }\n\n      // compile\n      var compiled = compile(template, options);\n\n      // check compilation errors/tips\n      {\n        if (compiled.errors && compiled.errors.length) {\n          warn(\n            \"Error compiling template:\\n\\n\" + template + \"\\n\\n\" +\n            compiled.errors.map(function (e) { return (\"- \" + e); }).join('\\n') + '\\n',\n            vm\n          );\n        }\n        if (compiled.tips && compiled.tips.length) {\n          compiled.tips.forEach(function (msg) { return tip(msg, vm); });\n        }\n      }\n\n      // turn code into functions\n      var res = {};\n      var fnGenErrors = [];\n      res.render = makeFunction(compiled.render, fnGenErrors);\n      var l = compiled.staticRenderFns.length;\n      res.staticRenderFns = new Array(l);\n      for (var i = 0; i < l; i++) {\n        res.staticRenderFns[i] = makeFunction(compiled.staticRenderFns[i], fnGenErrors);\n      }\n\n      // check function generation errors.\n      // this should only happen if there is a bug in the compiler itself.\n      // mostly for codegen development use\n      /* istanbul ignore if */\n      {\n        if ((!compiled.errors || !compiled.errors.length) && fnGenErrors.length) {\n          warn(\n            \"Failed to generate render function:\\n\\n\" +\n            fnGenErrors.map(function (ref) {\n              var err = ref.err;\n              var code = ref.code;\n\n              return ((err.toString()) + \" in\\n\\n\" + code + \"\\n\");\n            }).join('\\n'),\n            vm\n          );\n        }\n      }\n\n      return (functionCompileCache[key] = res)\n    }\n\n    return {\n      compile: compile,\n      compileToFunctions: compileToFunctions\n    }\n  }\n\n  /*  */\n\n  function transformNode (el, options) {\n    var warn = options.warn || baseWarn;\n    var staticClass = getAndRemoveAttr(el, 'class');\n    if (\"development\" !== 'production' && staticClass) {\n      var expression = parseText(staticClass, options.delimiters);\n      if (expression) {\n        warn(\n          \"class=\\\"\" + staticClass + \"\\\": \" +\n          'Interpolation inside attributes has been removed. ' +\n          'Use v-bind or the colon shorthand instead. For example, ' +\n          'instead of <div class=\"{{ val }}\">, use <div :class=\"val\">.'\n        );\n      }\n    }\n    if (staticClass) {\n      el.staticClass = JSON.stringify(staticClass);\n    }\n    var classBinding = getBindingAttr(el, 'class', false /* getStatic */);\n    if (classBinding) {\n      el.classBinding = classBinding;\n    }\n  }\n\n  function genData$1 (el) {\n    var data = '';\n    if (el.staticClass) {\n      data += \"staticClass:\" + (el.staticClass) + \",\";\n    }\n    if (el.classBinding) {\n      data += \"class:\" + (el.classBinding) + \",\";\n    }\n    return data\n  }\n\n  var klass$1 = {\n    staticKeys: ['staticClass'],\n    transformNode: transformNode,\n    genData: genData$1\n  };\n\n  /*  */\n\n  function transformNode$1 (el, options) {\n    var warn = options.warn || baseWarn;\n    var staticStyle = getAndRemoveAttr(el, 'style');\n    if (staticStyle) {\n      /* istanbul ignore if */\n      {\n        var expression = parseText(staticStyle, options.delimiters);\n        if (expression) {\n          warn(\n            \"style=\\\"\" + staticStyle + \"\\\": \" +\n            'Interpolation inside attributes has been removed. ' +\n            'Use v-bind or the colon shorthand instead. For example, ' +\n            'instead of <div style=\"{{ val }}\">, use <div :style=\"val\">.'\n          );\n        }\n      }\n      el.staticStyle = JSON.stringify(parseStyleText(staticStyle));\n    }\n\n    var styleBinding = getBindingAttr(el, 'style', false /* getStatic */);\n    if (styleBinding) {\n      el.styleBinding = styleBinding;\n    }\n  }\n\n  function genData$2 (el) {\n    var data = '';\n    if (el.staticStyle) {\n      data += \"staticStyle:\" + (el.staticStyle) + \",\";\n    }\n    if (el.styleBinding) {\n      data += \"style:(\" + (el.styleBinding) + \"),\";\n    }\n    return data\n  }\n\n  var style$1 = {\n    staticKeys: ['staticStyle'],\n    transformNode: transformNode$1,\n    genData: genData$2\n  };\n\n  var modules$1 = [\n    klass$1,\n    style$1\n  ];\n\n  /*  */\n\n  function text (el, dir) {\n    if (dir.value) {\n      addProp(el, 'textContent', (\"_s(\" + (dir.value) + \")\"));\n    }\n  }\n\n  /*  */\n\n  function html (el, dir) {\n    if (dir.value) {\n      addProp(el, 'innerHTML', (\"_s(\" + (dir.value) + \")\"));\n    }\n  }\n\n  var directives$1 = {\n    model: model,\n    text: text,\n    html: html\n  };\n\n  /*  */\n\n  var baseOptions = {\n    expectHTML: true,\n    modules: modules$1,\n    directives: directives$1,\n    isPreTag: isPreTag,\n    isUnaryTag: isUnaryTag,\n    mustUseProp: mustUseProp,\n    isReservedTag: isReservedTag,\n    getTagNamespace: getTagNamespace,\n    staticKeys: genStaticKeys(modules$1)\n  };\n\n  var ref$1 = createCompiler(baseOptions);\n  var compileToFunctions = ref$1.compileToFunctions;\n\n  /*  */\n\n  var idToTemplate = cached(function (id) {\n    var el = query(id);\n    return el && el.innerHTML\n  });\n\n  var mount = Vue$3.prototype.$mount;\n  Vue$3.prototype.$mount = function (\n    el,\n    hydrating\n  ) {\n    el = el && query(el);\n\n    /* istanbul ignore if */\n    if (el === document.body || el === document.documentElement) {\n      \"development\" !== 'production' && warn(\n        \"Do not mount Vue to <html> or <body> - mount to normal elements instead.\"\n      );\n      return this\n    }\n\n    var options = this.$options;\n    // resolve template/el and convert to render function\n    if (!options.render) {\n      var template = options.template;\n      if (template) {\n        if (typeof template === 'string') {\n          if (template.charAt(0) === '#') {\n            template = idToTemplate(template);\n            /* istanbul ignore if */\n            if (\"development\" !== 'production' && !template) {\n              warn(\n                (\"Template element not found or is empty: \" + (options.template)),\n                this\n              );\n            }\n          }\n        } else if (template.nodeType) {\n          template = template.innerHTML;\n        } else {\n          {\n            warn('invalid template option:' + template, this);\n          }\n          return this\n        }\n      } else if (el) {\n        template = getOuterHTML(el);\n      }\n      if (template) {\n        /* istanbul ignore if */\n        if (\"development\" !== 'production' && config.performance && mark) {\n          mark('compile');\n        }\n\n        var ref = compileToFunctions(template, {\n          shouldDecodeNewlines: shouldDecodeNewlines,\n          delimiters: options.delimiters\n        }, this);\n        var render = ref.render;\n        var staticRenderFns = ref.staticRenderFns;\n        options.render = render;\n        options.staticRenderFns = staticRenderFns;\n\n        /* istanbul ignore if */\n        if (\"development\" !== 'production' && config.performance && mark) {\n          mark('compile end');\n          measure(((this._name) + \" compile\"), 'compile', 'compile end');\n        }\n      }\n    }\n    return mount.call(this, el, hydrating)\n  };\n\n  /**\n   * Get outerHTML of elements, taking care\n   * of SVG elements in IE as well.\n   */\n  function getOuterHTML (el) {\n    if (el.outerHTML) {\n      return el.outerHTML\n    } else {\n      var container = document.createElement('div');\n      container.appendChild(el.cloneNode(true));\n      return container.innerHTML\n    }\n  }\n\n  Vue$3.compile = compileToFunctions;\n\n  return Vue$3;\n\n})));\n"
  },
  {
    "path": "src/main/resources/static/js/common.js",
    "content": "var vm_common = new Vue({\n    el: '#header',\n    data: {\n        messageList: [],\n        noticeList: [],\n    },\n    methods: {},\n    created: getInit()\n})\n\nfunction getInit() {\n    getUnReadMessages();\n    getUnReadNotices();\n    setHeadImage('headImageDIV');\n\n}\n\n/**\n * 护眼模式\n */\nfunction changeTheme() {\n    //这里toggleClass的意思是如果 有就删掉 没有就加上\n    //按钮切换\n    $('#eyesI').toggleClass('am-icon-toggle-off');\n    $('#eyesI').toggleClass('am-icon-toggle-on');\n    //主题切换\n    $('body').toggleClass('theme-white');\n    $('body').toggleClass('theme-black');\n    //保存到浏览器缓存 这个暂时不需要 先注着\n    saveSelectColor.Color = $('body').attr('class');\n    storageSave(saveSelectColor);\n}\n\n/**\n * 更换头像\n */\nfunction changeImage(num){\n    var path = contextPath + \"/assets/img/0\"+num+\".jpg\";\n    $('#headImage').attr('src',path);\n    $('#hidden').val(num);\n    $('#changeImageModal').modal('close');\n}\n\n//退出登录\nfunction exit() {\n    sessionStorage.clear();\n    window.location.href = contextPath + '/logout';\n}\n\n//左边栏的隐藏和出现\nfunction leftSidebar() {\n    if ($('.left-sidebar').attr('class').indexOf('active') > 0\n        && $('.tpl-content-wrapper').attr('class').indexOf('active') > 0) {\n        $('.left-sidebar').addClass('active');\n        $('.tpl-content-wrapper').addClass('active');\n    } else {\n        $('.left-sidebar').removeClass('active');\n        $('.tpl-content-wrapper').removeClass('active');\n    }\n}\n\n\n/**\n * 只传一个参数 ，标题不传就用默认标题，需要自定义标题就传入2个参数\n * @param text  内容\n * @param title 标题\n */\nfunction showAlert(text, title) {\n    if (title == null || title == '' || title == undefined) {\n        title = '系统提示';\n    }\n    $(\"#alertTitle\").html(title);\n    $(\"#alertText\").html(text);\n    $(\"#showAlertID\").modal();\n}\n\n/**\n * 传入只一个参数就是内容 如果传了2个参数那 第二个就是标题\n * 以此类推 第三个是取消的按钮显示的字 第四个是确认按钮显示的字\n * @param text  内容\n * @param title 标题\n * @param cancel    取消\n * @param ok    确认\n * @return 直接返回div的对象，可以连着点modal启用\n *\n * 栗子\n showConfirm('测试','你好','算了','滚蛋').modal({\n     onConfirm: function() {\n         //干点啥\n     },\n    onCancel: function() {\n         //干点啥\n    }\n});\n */\nfunction showConfirm(text, title, cancel, ok) {\n    if (title == null || title == '' || title == undefined) {\n        title = '系统提示';\n    }\n    if (cancel == null || cancel == '' || cancel == undefined) {\n        cancel = '取消';\n    }\n    if (ok == null || ok == '' || ok == undefined) {\n        ok = '确定';\n    }\n    $(\"#confirmTitle\").html(title);\n    $(\"#confirmText\").html(text);\n    $('#confirmCancel').text(cancel);\n    $('#confirmOK').text(ok);\n    return $('#showConfirmID');\n}\n\n\n/**\n * 只有第一个参数 text 是必填项，其余都是可选项\n * 直接上栗子\n showPrompt('内容','标题','取消','确定').modal({\n      onConfirm: function(e) {\n        alert('你输入的是：' + e.data)\n      }\n    });\n */\nfunction showPrompt(text, title, cancel, ok) {\n    if (title == null || title == '' || title == undefined) {\n        title = '系统提示';\n    }\n    if (cancel == null || cancel == '' || cancel == undefined) {\n        cancel = '取消';\n    }\n    if (ok == null || ok == '' || ok == undefined) {\n        ok = '确定';\n    }\n    $(\"#promptTitle\").html(title);\n    $(\"#promptText\").html(text);\n    $('#promptCancel').text(cancel);\n    $('#promptOK').text(ok);\n    return $('#showPromptID');\n}\n\n/**\n * 修改密码\n */\nfunction changePassWord() {\n    var oldpassword = $('#oldpassword').val();\n    var newpassword = $('#newpassword').val();\n    var repeatpassword = $('#repeatpassword').val();\n    var uPattern = /^[a-zA-Z0-9_-]{6,20}$/;\n    if (!uPattern.test(newpassword)) {\n        showAlert('密码必须是数字或者字母,长度为6-20字符之间,请重新输入', '您输入的密码不正确');\n    } else if (oldpassword == newpassword) {\n        showAlert('新密码不能和旧密码相同', '您输入的密码不正确');\n\n    } else if (newpassword != repeatpassword) {\n        showAlert('新密码两次输入不一致，请重新输入', '您输入的密码不正确');\n    } else {\n        //基本验证通过 进入后台验证\n        $.ajax({\n            type: \"POST\",\n            url: contextPath + '/userinfo/setNewPassWord',\n            data: {\n                'oldpassword': oldpassword,\n                'newpassword': newpassword,\n                'repeatpassword': repeatpassword\n            },\n            dataType: \"json\",\n            success: function (result) {\n                if (result.code == '101') {\n                    showAlert('发生了异常 : ' + result.message);\n                } else if (result.code == '000') {\n                    showAlert('修改密码成功', '成功')\n                }\n            }\n        });\n    }\n}\n\n/**\n * 这里用来获取本人的未读信息\n */\nfunction getUnReadMessages() {\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/message/getUnReadMessages\",\n        dataType: \"json\",\n        success: function (result) {\n            if (result.code == 000) {\n                vm_common.messageList = result.value;\n            }\n        }\n    });\n}\n\n/**\n * 获取未读公告\n */\nfunction getUnReadNotices() {\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/notice/getUnReadNotices\",\n        dataType: \"json\",\n        success: function (result) {\n            if (result.code == 000) {\n                vm_common.noticeList = result.value;\n            }\n        }\n    });\n}\n\n/**\n * 由于改后台的未读信息数据 前台要等刷新才能看出效果\n * 这里做一个假的读过就简一的效果\n */\nfunction changenums(spanID) {\n    var num = $('#' + spanID).text();\n    if (num - 1 == 0) {\n        $('#' + spanID).text('')\n    } else {\n        $('#' + spanID).text(num - 1)\n    }\n}\n\n/**\n * 设置本人头像\n * 传入需要显示头像的img标签的id\n */\nfunction setHeadImage(imgID) {\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/userinfo/getHeadImageNumByID\",\n        dataType: \"json\",\n        success: function (result) {\n            if(result.code == 000){\n                var path = contextPath+\"/assets/img/0\"+result.value+\".jpg\";\n                $('#'+imgID).attr(\"src\",path);\n            }\n        }\n    });\n}"
  },
  {
    "path": "src/main/resources/static/js/index.js",
    "content": "/*获取当前日期*/\nfunction getCurrentDateTime() {\n    var d = new Date();\n    var year = d.getFullYear();\n    var month = d.getMonth() + 1;\n    var date = d.getDate();\n    var week = d.getDay();\n    /*时分秒*/\n    /*var hours = d.getHours();\n    var minutes = d.getMinutes();\n    var seconds = d.getSeconds();\n    var ms = d.getMilliseconds();*/\n    var curDateTime = year;\n    if (month > 9)\n        curDateTime = curDateTime + \"年\" + month;\n    else\n        curDateTime = curDateTime + \"年0\" + month;\n    if (date > 9)\n        curDateTime = curDateTime + \"月\" + date + \"日\";\n    else\n        curDateTime = curDateTime + \"月0\" + date + \"日\";\n    /*if (hours > 9)\n    curDateTime = curDateTime + \" \" + hours;\n    else\n    curDateTime = curDateTime + \" 0\" + hours;\n    if (minutes > 9)\n    curDateTime = curDateTime + \":\" + minutes;\n    else\n    curDateTime = curDateTime + \":0\" + minutes;\n    if (seconds > 9)\n    curDateTime = curDateTime + \":\" + seconds;\n    else\n    curDateTime = curDateTime + \":0\" + seconds;*/\n    var weekday = \"\";\n    if (week == 0)\n        weekday = \"星期日\";\n    else if (week == 1)\n        weekday = \"星期一\";\n    else if (week == 2)\n        weekday = \"星期二\";\n    else if (week == 3)\n        weekday = \"星期三\";\n    else if (week == 4)\n        weekday = \"星期四\";\n    else if (week == 5)\n        weekday = \"星期五\";\n    else if (week == 6)\n        weekday = \"星期六\";\n    curDateTime = curDateTime + \" \" + weekday;\n    return curDateTime;\n}\n\n/*获取当前农历*/\nfunction showCal(){\n    var D=new Date();\n    var yy=D.getFullYear();\n    var mm=D.getMonth()+1;\n    var dd=D.getDate();\n    var ww=D.getDay();\n    var ss=parseInt(D.getTime() / 1000);\n    if (yy<100) yy=\"19\"+yy;\n    return GetLunarDay(yy,mm,dd);\n}\n\n//定义全局变量\nvar CalendarData=new Array(100);\nvar madd=new Array(12);\nvar tgString=\"甲乙丙丁戊己庚辛壬癸\";\nvar dzString=\"子丑寅卯辰巳午未申酉戌亥\";\nvar numString=\"一二三四五六七八九十\";\nvar monString=\"正二三四五六七八九十冬腊\";\nvar weekString=\"日一二三四五六\";\nvar sx=\"鼠牛虎兔龙蛇马羊猴鸡狗猪\";\nvar cYear,cMonth,cDay,TheDate;\nCalendarData = new Array(0xA4B,0x5164B,0x6A5,0x6D4,0x415B5,0x2B6,0x957,0x2092F,0x497,0x60C96,0xD4A,0xEA5,0x50DA9,0x5AD,0x2B6,0x3126E, 0x92E,0x7192D,0xC95,0xD4A,0x61B4A,0xB55,0x56A,0x4155B, 0x25D,0x92D,0x2192B,0xA95,0x71695,0x6CA,0xB55,0x50AB5,0x4DA,0xA5B,0x30A57,0x52B,0x8152A,0xE95,0x6AA,0x615AA,0xAB5,0x4B6,0x414AE,0xA57,0x526,0x31D26,0xD95,0x70B55,0x56A,0x96D,0x5095D,0x4AD,0xA4D,0x41A4D,0xD25,0x81AA5,0xB54,0xB6A,0x612DA,0x95B,0x49B,0x41497,0xA4B,0xA164B, 0x6A5,0x6D4,0x615B4,0xAB6,0x957,0x5092F,0x497,0x64B, 0x30D4A,0xEA5,0x80D65,0x5AC,0xAB6,0x5126D,0x92E,0xC96,0x41A95,0xD4A,0xDA5,0x20B55,0x56A,0x7155B,0x25D,0x92D,0x5192B,0xA95,0xB4A,0x416AA,0xAD5,0x90AB5,0x4BA,0xA5B, 0x60A57,0x52B,0xA93,0x40E95);\nmadd[0]=0;\nmadd[1]=31;\nmadd[2]=59;\nmadd[3]=90;\nmadd[4]=120;\nmadd[5]=151;\nmadd[6]=181;\nmadd[7]=212;\nmadd[8]=243;\nmadd[9]=273;\nmadd[10]=304;\nmadd[11]=334;\n\nfunction GetBit(m,n){\n    return (m>>n)&1;\n}\n//农历转换\nfunction e2c(){\n    TheDate= (arguments.length!=3) ? new Date() : new Date(arguments[0],arguments[1],arguments[2]);\n    var total,m,n,k;\n    var isEnd=false;\n    var tmp=TheDate.getYear();\n    if(tmp<1900){\n        tmp+=1900;\n    }\n    total=(tmp-1921)*365+Math.floor((tmp-1921)/4)+madd[TheDate.getMonth()]+TheDate.getDate()-38;\n\n    if(TheDate.getYear()%4==0&&TheDate.getMonth()>1) {\n        total++;\n    }\n    for(m=0;;m++){\n        k=(CalendarData[m]<0xfff)?11:12;\n        for(n=k;n>=0;n--){\n            if(total<=29+GetBit(CalendarData[m],n)){\n                isEnd=true; break;\n            }\n            total=total-29-GetBit(CalendarData[m],n);\n        }\n        if(isEnd) break;\n    }\n    cYear=1921 + m;\n    cMonth=k-n+1;\n    cDay=total;\n    if(k==12){\n        if(cMonth==Math.floor(CalendarData[m]/0x10000)+1){\n            cMonth=1-cMonth;\n        }\n        if(cMonth>Math.floor(CalendarData[m]/0x10000)+1){\n            cMonth--;\n        }\n    }\n}\n\nfunction GetcDateString(){\n    var tmp=\"\";\n    /*显示农历年：（ 如：甲午(马)年 ）*/\n    /*tmp+=tgString.charAt((cYear-4)%10);\n    tmp+=dzString.charAt((cYear-4)%12);\n    tmp+=\"(\";\n    tmp+=sx.charAt((cYear-4)%12);\n    tmp+=\")年 \";*/\n    if(cMonth<1){\n        tmp+=\"(闰)\";\n        tmp+=monString.charAt(-cMonth-1);\n    }else{\n        tmp+=monString.charAt(cMonth-1);\n    }\n    tmp+=\"月\";\n    tmp+=(cDay<11)?\"初\":((cDay<20)?\"十\":((cDay<30)?\"廿\":\"三十\"));\n    if (cDay%10!=0||cDay==10){\n        tmp+=numString.charAt((cDay-1)%10);\n    }\n    return tmp;\n}\n\nfunction GetLunarDay(solarYear,solarMonth,solarDay){\n//solarYear = solarYear<1900?(1900+solarYear):solarYear;\n    if(solarYear<1921 || solarYear>2020){\n        return \"\";\n    }else{\n        solarMonth = (parseInt(solarMonth)>0) ? (solarMonth-1) : 11;\n        e2c(solarYear,solarMonth,solarDay);\n        return GetcDateString();\n    }\n}\n\n/**\n * 获取最新站内信\n */\nfunction getLastMessage() {\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/message/getLastMessage\",\n        dataType: \"json\",\n        success: function (result) {\n            if(result.code == 000){\n                $('#messageP').text(result.value[0].message);\n                $('#MessageRealnameS').text(result.value[0].realname);\n                $('#MessageSendTimeS').text(result.value[0].create_time);\n            }\n        }\n    });\n}\n\n/**\n * 获取最新公告\n */\nfunction getLastNotice() {\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/notice/getLastNotice\",\n        dataType: \"json\",\n        success: function (result) {\n            if(result.code == 000){\n                $('#noticeP').text(result.value[0].notice);\n                $('#NoticeRealnameS').text(result.value[0].realname);\n                $('#NoticeSendTimeS').text(result.value[0].create_time);\n            }\n        }\n    });\n}\n\n/**\n * 获取最佳员工\n */\nfunction getBestImageNum() {\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/userinfo/getBestImageNum\",\n        dataType: \"json\",\n        success: function (result) {\n            if(result.code == 000){\n                //这里返回的是最佳员工的头像的图片数字1~6 默认1\n                var path = contextPath+\"/assets/img/0\"+result.value+\".jpg\";\n                $('#bestImg').attr(\"src\",path);\n            }\n        }\n    });\n}\n\n/**\n * 设置首页上的最佳员工名字\n */\nfunction getBestUserName() {\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/userinfo/getBestUserName\",\n        dataType: \"json\",\n        success: function (result) {\n            if(result.code == 000){\n                //这里返回的是最佳员工的头像的图片数字1~6 默认1\n                $('#bestName').text(result.value);\n            }\n        }\n    });\n}"
  },
  {
    "path": "src/main/resources/static/js/logs.js",
    "content": "var vm_log = new Vue({\n    el: '#log',\n    data: {\n        fileNames: []\n    },\n    methods: {\n        getFileNames: getFileNames,\n        readFiles: readFiles\n    },\n    created: getInit()\n})\n\nfunction getInit() {\n    getFileNames();\n}\n\n//查看所有log文件的文件名\nfunction getFileNames() {\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/admin/getFileNames\",\n        success: function (result) {\n            vm_log.fileNames = result.value.reverse();\n        }\n    });\n}\n\n//读取某个log文件的具体内容 直接显示到内容区域\nfunction readFiles() {\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/admin/readFiles\",\n        data: {fileName: $(\"#fileName\").val()},\n        success: function (result) {\n            if (result.code == 000) {\n                $('#logPre').html(result.value);\n            } else {\n                $('#logPre').html(result.message);\n            }\n            //这是一个代码高亮的js但是他比较2 因为他必须在代码出现之后加载才有效，所以最后加载他\n            $.getScript(contextPath + \"/prism/prism.js\");\n        }\n    });\n}\n\n/**\n * 自适应高度\n */\nfunction reSizePre() {\n    //方法就用最简单粗暴的了，屏幕分辨率高度除以倍数取整数加单位\n    var maxHeight = parseInt(window.screen.availHeight / 18) + 'rem';\n    $('.am-pre-scrollable').css('max-height', maxHeight);\n}"
  },
  {
    "path": "src/main/resources/static/js/message.js",
    "content": "var vm_message = new Vue({\n    el: '#message',\n    data: {\n        messages: [],\n        pageInfo : {},\n        pageNum : 0\n    },\n    methods: {\n        getMessages: getMessages,\n        getAllUser: getAllUser\n    },\n    created: getInit()\n})\n\nfunction getInit() {\n    getAllUser();\n    getMessages();\n}\n\n//查询员工\nfunction getAllUser() {\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/message/getAllUser\",\n        dataType: \"json\",\n        success: function (result) {\n            //返回的是所有的用户的ID realname和部门名称\n            vm_message.userList = result.value;\n            //初始化 收件人 下拉列表\n            initReceives();\n        }\n    });\n}\n\n/**\n * 这里用的是一个带搜索框 带分组的下拉列表 可以多选 内容会根据sql取到的内容 动态加载\n * 分组按照部门名称\n * 这里用code先记录代码，后面一起append，是因为先append不带结束标签的内容，html会自作聪明加结束标签导致异常\n * 大致上的思路就是和斐波那契数列判断逻辑类似\n * 用一个temp记录上一条部门叫什么\n * 如果temp里面是空的说明是第一次循环  直接给初始值\n * 如果temp里面内容和上一次一样的      说明上条和本条同部门 直接过\n * 如果temp里面内容和上一次不一样      说明循环到新的部门了 加结束标签 加新的开始标签\n *\n * 中间无论如何都无脑加option\n *\n * 最后一次循环加上结束标签\n *\n * 出来的结果就是\n * <optgroup 部门1>\n *      <参数1/>\n *      <参数2/>\n *      <参数3/>\n * </optgroup>\n * <optgroup 部门2>\n *      <参数1/>\n * </optgroup>\n * 以此类推。。。\n */\nfunction initReceives() {\n    //需要把数据按照一定规律装载进select\n    var tempdepartment = \"\";\n    var code = \"\";\n    for (var i = 0; i < vm_message.userList.length; i++) {\n        var id = vm_message.userList[i].id;\n        var realname = vm_message.userList[i].realname;\n        var department = vm_message.userList[i].department;\n        //如果tempdepartment == \"\" 说明第一次执行 不用判断直接给department\n        if (tempdepartment == \"\") {\n            tempdepartment = department;\n            code += '<optgroup label=' + department + '>';\n        } else if (tempdepartment != department) {\n            //不是第一次执行，要判断的是上一条的部门和这条是否一样 不一样才重新开一组\n            tempdepartment = department;\n            code += '</optgroup><optgroup label=' + department + '>';\n        }\n        //动态装载用户\n        code += '<option value=' + id + '>' + realname + '</option>';\n        if (i == vm_message.userList.length - 1) {\n            code += '</optgroup>';\n        }\n    }\n    $('#receives').append(code)\n}\n\n/**\n * 发送站内信 支持群发\n */\nfunction sendMessage() {\n    var userIDs = $('#receives').val().toString();\n    var title = $('#messageTitle').val();\n    var message = $('#messageMain').val();\n    if (userIDs == null || userIDs == \"\" || userIDs == undefined) {\n        showAlert(\"请选择收件人\");\n    } else if (title == null || title == \"\" || title == undefined) {\n        showAlert(\"请输入标题\");\n    } else if (title.length > 20) {\n        showAlert(\"标题不能超过20字\");\n    } else if (message == null || message == \"\" || message == undefined) {\n        showAlert(\"请输入内容\");\n    } else if (message.length > 500) {\n        showAlert(\"内容不能超过500字\");\n    } else {\n        var data = {};\n        data.userIDs = userIDs;\n        data.title = title;\n        data.message = message;\n        $.ajax({\n            type: \"POST\",\n            url: contextPath + \"/message/send_message\",\n            data: data,\n            dataType: \"json\",\n            success: function (result) {\n                if (result.code == 000) {\n                    showAlert(\"发送成功!\");\n                    setTimeout(function(){\n                        window.location.href=\"/projectoa/message/message\"\n                    },2000);\n                } else {\n                    showAlert(\"发送失败 \" + result.message);\n                }\n\n            }\n        });\n    }\n}\n\n/**\n * 获取所有未读信息(本人的)\n */\nfunction getMessages(pageNum) {\n    if (pageNum == 0){\n        pageNum = 1;\n    }\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/message/getMessages\",\n        data:{\n            \"pageNum\" : pageNum\n        },\n        dataType: \"json\",\n        success: function (result) {\n            if (result.code == 000) {\n                vm_message.messages = result.value.list;\n                vm_message.pageInfo.pageNum = result.value.pageNum;\n                vm_message.pageInfo.pages = result.value.pages;\n                vm_message.pageInfo.prePage = result.value.prePage;\n                vm_message.pageInfo.nextPage = result.value.nextPage;\n                vm_message.pageInfo.isFirstPage = result.value.isFirstPage;\n                vm_message.pageInfo.isLastPage = result.value.isLastPage;\n                vm_message.pageNum = result.value.pageNum;\n            } else {\n                showAlert(\"获取站内信异常!\")\n            }\n        }\n    });\n}"
  },
  {
    "path": "src/main/resources/static/js/message_dtl.js",
    "content": "function getMessageDtl() {\n    var url = window.location.href;\n    var index = url.lastIndexOf(\"\\/\");\n    var id  = url.substring(index + 1, url.length);\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/message/getMessageDtl\",\n        data: {id:id},\n        dataType: \"json\",\n        success: function (result) {\n            if(result.code == 000){\n                $('#message_dtl_title').text(result.value.title);\n                $('#message_dtl_main').text(result.value.message);\n                //发件人姓名再查一次 和时间一起注入span\n                var realName = getSendUserName(result.value.sendId);\n                $('#sendUserName').text(realName);\n                $('#sendTime').text(result.value.createTime);\n                //最后他打开了这条 就把这条从未读里删除\n                setIsRead(result.value.id);\n            }else{\n                showAlert(\"获取站内信异常!\")\n            }\n        }\n    });\n}\n\n/**\n * 设为已读\n */\nfunction setIsRead(messageID) {\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/message/setIsRead\",\n        data: {id:messageID},\n        dataType: \"json\",\n        success: function (result) {\n            //后台成功后 前台做个假的-1效果 弥补刷新前页面数字还是老的问题\n            if(result.code == 000){\n                changenums('messageUnReadNum');\n            }\n\n        }\n    });\n}\nfunction getSendUserName(sendID) {\n    var realName = \"\";\n    $.ajax({\n        type: \"POST\",\n        async:false,//同步\n        url: contextPath + \"/message/getSendUserName\",\n        data: {id:sendID},\n        dataType: \"json\",\n        success: function (result) {\n            if(result.code == 000){\n                realName = result.value;\n            }\n        }\n    });\n    return realName;\n}"
  },
  {
    "path": "src/main/resources/static/js/notice.js",
    "content": "var vm_notice = new Vue({\n    el: '#notice',\n    data: {\n        notices: [],\n        pageInfo : {},\n        pageNum : 0\n    },\n    methods: {\n        getNotices: getNotices\n    },\n    created: getInit()\n})\n\nfunction getInit() {\n    getNotices(1);\n}\n\n\n/**\n * 获取所有未读信息(本人的)\n */\nfunction getNotices(pageNum) {\n    if (pageNum == 0){\n        pageNum = 1;\n    }\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/notice/getNotices\",\n        data : {\n            \"pageNum\":pageNum\n        },\n        dataType: \"json\",\n        success: function (result) {\n            if (result.code == 000) {\n                vm_notice.notices = result.value.list;\n                vm_notice.pageInfo.pageNum = result.value.pageNum;\n                vm_notice.pageInfo.pages = result.value.pages;\n                vm_notice.pageInfo.prePage = result.value.prePage;\n                vm_notice.pageInfo.nextPage = result.value.nextPage;\n                vm_notice.pageInfo.isFirstPage = result.value.isFirstPage;\n                vm_notice.pageInfo.isLastPage = result.value.isLastPage;\n                vm_notice.pageNum = result.value.pageNum;\n            } else {\n                showAlert(\"获取站内信异常!\")\n            }\n        }\n    });\n}"
  },
  {
    "path": "src/main/resources/static/js/notice_create.js",
    "content": "/**\n * 发送公告 默认就是发送给所有人\n */\nfunction sendNotice() {\n    var title = $('#noticeTile').val();\n    var notice = $('#noticeMain').val();\n    if (title == null || title == \"\" || title == undefined) {\n        showAlert(\"请输入标题\");\n    } else if (title.length > 20) {\n        showAlert(\"标题不能超过20字\");\n    } else if (notice == null || notice == \"\" || notice == undefined) {\n        showAlert(\"请输入内容\");\n    } else if (notice.length > 500) {\n        showAlert(\"内容不能超过500字\");\n    } else {\n        var data = {};\n        data.title = title;\n        data.notice = notice;\n        $.ajax({\n            type: \"POST\",\n            url: contextPath + \"/notice/send_notice\",\n            data: data,\n            dataType: \"json\",\n            success: function (result) {\n                if (result.code == 000) {\n                    showAlert(\"发送成功!\");\n                    setTimeout(function(){\n                        window.location.href=\"/projectoa/notice/notice\"\n                    },2000);\n                } else {\n                    showAlert(\"发送失败 \" + result.message);\n                }\n            }\n        });\n    }\n}\n\n"
  },
  {
    "path": "src/main/resources/static/js/notice_dtl.js",
    "content": "function getNoticeDtl() {\n    var url = window.location.href;\n    var index = url.lastIndexOf(\"\\/\");\n    var id  = url.substring(index + 1, url.length);\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/notice/getNoticeDtl\",\n        data: {id:id},\n        dataType: \"json\",\n        success: function (result) {\n            if(result.code == 000){\n                $('#notice_dtl_title').text(result.value.title);\n                $('#notice_dtl_main').text(result.value.notice);\n                //发件人姓名再查一次 和时间一起注入span\n                var realName = getSendUserName(result.value.sendId);\n                $('#sendUserName').text(realName);\n                $('#sendTime').text(result.value.createTime);\n                //最后他打开了这条 就把这条从未读里删除\n                setIsRead(result.value.id);\n            }else{\n                showAlert(\"获取站内信异常!\")\n            }\n        }\n    });\n}\n\n/**\n * 设为已读\n */\nfunction setIsRead(noticeID) {\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/notice/setIsRead\",\n        data: {id:noticeID},\n        dataType: \"json\",\n        success: function (result) {\n            if(result.code == 000){\n                changenums('noticeUnReadNum');\n            }\n        }\n    });\n}\n\n/**\n * 取发件人真实姓名\n * 此方法与message公用\n */\nfunction getSendUserName(sendID) {\n    var realName = \"\";\n    $.ajax({\n        type: \"POST\",\n        async:false,//同步\n        url: contextPath + \"/message/getSendUserName\",\n        data: {id:sendID},\n        dataType: \"json\",\n        success: function (result) {\n            if(result.code == 000){\n                realName = result.value;\n            }\n        }\n    });\n    return realName;\n}"
  },
  {
    "path": "src/main/resources/static/js/user.js",
    "content": "var vm = new Vue({\n    el : '#user',\n    data : {\n        departments : [],\n        positions : [],\n        userList : [],\n        pageInfo : {},\n        pageNum : 0\n    },\n    methods : {\n        getPosition : getPosition,\n        getDepartment : getDepartment,\n        getUser : getUser,\n        deleteUser : deleteUser,\n        reverseUser : reverseUser,\n        setBest:setBest\n    },\n    created : getInit()\n\n})\n\nfunction getInit() {\n    getDepartment();\n    getPosition();\n    getUser(1);\n}\n\nfunction setBest() {\n    var id=event.target.id.replace(\"best_\", \"\");\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/user/setBest\",\n        data: {id:id},\n        dataType: \"json\",\n        success: function(result){\n            if (result.code == 000){\n                //成功\n                showAlert('设置成功');\n                setTimeout(function(){\n                    window.location.href=\"user\"\n                },1000);\n\n            }else {\n                //失败\n                showAlert(result.message);\n            }\n        }\n    });\n}\n\n//查询职位\nfunction getPosition() {\n    $.ajax({\n        type: \"POST\",\n        url: \"/projectoa/position/query\",\n        //data: {username:$(\"#username\").val(), content:$(\"#content\").val()},\n        //dataType: \"json\",\n        success: function(result){\n            vm.positions = result.value;\n        }\n    });\n}\n\n//查询部门\nfunction getDepartment() {\n    $.ajax({\n        type: \"POST\",\n        url: \"/projectoa/department/query\",\n        //data: {username:$(\"#username\").val(), content:$(\"#content\").val()},\n        //dataType: \"json\",\n        success: function(result){\n            vm.departments = result.value;\n        }\n    });\n}\n\n//查询员工\nfunction getUser(pageNum) {\n    if (pageNum == 0){\n        pageNum = 1;\n    }\n\n    var departmentId = $('#department').val() == 0 ? null : $('#department').val();\n    var positionId = $('#position').val() == 0 ? null : $('#position').val();\n    var realname = $('#realname').val() == '' ? null : $('#realname').val();\n    var users = {};\n    users.departmentId = departmentId;\n    users.positionId = positionId;\n    users.realname = realname;\n    users.pageNum = pageNum;\n\n\n    $.ajax({\n        type : \"POST\",\n        url : \"/projectoa/user/userList\",\n        data : users,\n        dataType : \"json\",\n        success : function (result) {\n            vm.userList = result.value.list;\n            vm.pageInfo.pageNum = result.value.pageNum;\n            vm.pageInfo.pages = result.value.pages;\n            vm.pageInfo.prePage = result.value.prePage;\n            vm.pageInfo.nextPage = result.value.nextPage;\n            vm.pageInfo.isFirstPage = result.value.isFirstPage;\n            vm.pageInfo.isLastPage = result.value.isLastPage;\n            vm.pageNum = result.value.pageNum;\n        }\n    })\n}\n\nfunction deleteUser() {\n    var id=event.target.id.replace(\"delete_\", \"\");\n    showConfirm('确定删除此员工么？','删除员工','取消','删除').modal({\n        onConfirm: function() {\n            $.ajax({\n                type: \"POST\",\n                url: contextPath + \"/user/userDelete/\" + id,\n                success: function(result){\n                    if (result.code == 000){\n                        //成功\n                        showAlert('删除成功');\n                        setTimeout(function(){\n                            window.location.href=\"user\"\n                        },2000);\n\n                    }else {\n                        //失败\n                        showAlert(result.message);\n                    }\n\n                }\n            });\n        },\n        onCancel: function() {\n            //干点啥\n        }\n    });\n}\n\nfunction reverseUser() {\n    var id=event.target.id.replace(\"reverse_\", \"\");\n    showConfirm('确定重置此员工密码么？','重置密码','取消','重置').modal({\n        onConfirm: function() {\n            $.ajax({\n                type: \"POST\",\n                url: contextPath + \"/user/userReverse/\" + id,\n                success: function(result){\n                    if (result.code == 000){\n                        //成功\n                        showAlert('重置成功');\n                        setTimeout(function(){\n                            window.location.href=\"user\"\n                        },2000);\n\n                    }else {\n                        //失败\n                        showAlert(result.message);\n                    }\n\n                }\n            });\n        },\n        onCancel: function() {\n            //干点啥\n        }\n    });\n}\n\n"
  },
  {
    "path": "src/main/resources/static/js/user_create.js",
    "content": "var vm = new Vue({\n    el : '#user_create',\n    data : {\n        departments : [],\n        positions : []\n    },\n    methods : {\n        getPosition : getPosition,\n        getDepartment : getDepartment,\n        createUser : createUser\n    },\n    created : getInit()\n\n})\n\nfunction getInit() {\n    getDepartment();\n    getPosition();\n}\n\n//查询职位\nfunction getPosition() {\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/position/query\",\n        //data: {username:$(\"#username\").val(), content:$(\"#content\").val()},\n        //dataType: \"json\",\n        success: function(result){\n            vm.positions = result.value;\n        }\n    });\n}\n\n//查询部门\nfunction getDepartment() {\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/department/query\",\n        //data: {username:$(\"#username\").val(), content:$(\"#content\").val()},\n        //dataType: \"json\",\n        success: function(result){\n            vm.departments = result.value;\n        }\n    });\n}\n\n//创建用户\nfunction createUser() {\n    var username = $('#username').val();\n    var realname = $('#realname').val();\n    var department_id = $('#department').val();\n    var position_id = $('#position').val();\n    var usernameSize = username.length;\n    //用户名正则，4到16位（字母，数字，下划线，减号）\n    var uPattern = /^[a-zA-Z0-9_-]{6,20}$/;\n    if (!uPattern.test(username)){\n        showAlert('用户名必须是数字或者字母,长度为6-20字符之间,请重新输入','您输入的用户名不正确');\n    }else if (realname == '' || realname == null){\n        showAlert('请输入员工姓名');\n    }else{\n        //发送创建用户请求\n        var data = {};\n        data.username = username;\n        data.realname = realname;\n        data.departmentId = department_id;\n        data.positionId = position_id;\n\n        $.ajax({\n            type: \"POST\",\n            url: contextPath + \"/user/userCreate\",\n            data: data,\n            dataType: \"json\",\n            success: function(result){\n                if (result.code == 000){\n                    //成功\n                    showAlert('创建成功');\n                }else {\n                    //失败\n                    showAlert(result.message);\n                }\n\n            }\n        });\n    }\n\n}"
  },
  {
    "path": "src/main/resources/static/js/user_edit.js",
    "content": "var vm = new Vue({\n    el : '#user_edit',\n    data : {\n        departments : [],\n        positions : [],\n        user : {},\n    },\n    methods : {\n        getPosition : getPosition,\n        getDepartment : getDepartment,\n        detailUser : detailUser,\n        editUser : editUser,\n    },\n    created : getInit()\n\n})\n\nfunction getInit() {\n    getDepartment();\n    getPosition();\n    detailUser();\n}\n\n//查询职位\nfunction getPosition() {\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/position/query\",\n        //data: {username:$(\"#username\").val(), content:$(\"#content\").val()},\n        //dataType: \"json\",\n        success: function(result){\n            vm.positions = result.value;\n        }\n    });\n}\n\n//查询部门\nfunction getDepartment() {\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/department/query\",\n        //data: {username:$(\"#username\").val(), content:$(\"#content\").val()},\n        //dataType: \"json\",\n        success: function(result){\n            vm.departments = result.value;\n        }\n    });\n}\n\n//用户回显\nfunction detailUser() {\n    var url = window.location.href;\n    var index = url.lastIndexOf(\"\\/\");\n    var id  = url.substring(index + 1, url.length);\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/user/detailUser/\" + id,\n        //data: {username:$(\"#username\").val(), content:$(\"#content\").val()},\n        //dataType: \"json\",\n        success: function(result){\n            vm.user = result.value;\n        }\n    });\n    \n}\n\n//修改用户\nfunction editUser() {\n    var url = window.location.href;\n    var index = url.lastIndexOf(\"\\/\");\n    var id  = url.substring(index + 1, url.length);\n\n    var realname = $('#realname').val();\n    var department_id = $('#department').val();\n    var position_id = $('#position').val();\n    var usernameSize = username.length;\n    //用户名正则，4到16位（字母，数字，下划线，减号）\n    var uPattern = /^[a-zA-Z0-9_-]{6,20}$/;\n    if (realname == '' || realname == null){\n        showAlert('请输入员工姓名');\n    }else{\n        //发送创建用户请求\n        var data = {};\n        data.realname = realname;\n        data.departmentId = department_id;\n        data.positionId = position_id;\n\n        $.ajax({\n            type: \"POST\",\n            url: contextPath + \"/user/userEdit/\" + id,\n            data: data,\n            dataType: \"json\",\n            success: function(result){\n                if (result.code == 000){\n                    //成功\n                    showAlert('修改成功');\n                }else {\n                    //失败\n                    showAlert(result.message);\n                }\n\n            }\n        });\n    }\n\n}"
  },
  {
    "path": "src/main/resources/static/js/userinfo.js",
    "content": "var vm = new Vue({\n    el : '#userinfo',\n    data : {\n        departments : [],\n        positions : [],\n        user : {},\n        userinfo : {},\n    },\n    methods : {\n        getPosition : getPosition,\n        getDepartment : getDepartment,\n        getUser : getUser,\n        getUserinfo : getUserinfo,\n        saveUserinfo : saveUserinfo\n    },\n    created : getInit()\n\n})\n\nfunction getInit() {\n    getDepartment();\n    getPosition();\n    getUser();\n    getUserinfo();\n}\n\n//查询职位\nfunction getPosition() {\n    $.ajax({\n        type: \"POST\",\n        url: \"/projectoa/position/query\",\n        //data: {username:$(\"#username\").val(), content:$(\"#content\").val()},\n        //dataType: \"json\",\n        success: function(result){\n            vm.positions = result.value;\n        }\n    });\n}\n\n//查询部门\nfunction getDepartment() {\n    $.ajax({\n        type: \"POST\",\n        url: \"/projectoa/department/query\",\n        //data: {username:$(\"#username\").val(), content:$(\"#content\").val()},\n        //dataType: \"json\",\n        success: function(result){\n            vm.departments = result.value;\n        }\n    });\n}\n\n//用户回显\nfunction getUser() {\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/userinfo/getSelf\",\n        //data: {username:$(\"#username\").val(), content:$(\"#content\").val()},\n        //dataType: \"json\",\n        success: function(result){\n            vm.user = result.value;\n        }\n    });\n\n}\n\n//用户信息回显\nfunction getUserinfo() {\n    $.ajax({\n       type : \"POST\",\n       url : contextPath + \"/userinfo/getUserinfo\",\n       success : function (result) {\n            vm.userinfo = result.value;\n            $('#birthday').datepicker('setValue', vm.userinfo.birthday);\n        }\n    });\n    \n}\n\nfunction saveUserinfo() {\n    var sex = $(\"input[name='sex']:checked\").val();\n    var birthday = $('#birthday').val() == '' ? undefined : $('#birthday').val();\n    var headImage = $('#hidden').val() == ''?1:$('#hidden').val();\n    var age = $('#age').val();\n    var identity_card = $('#idcard').val();\n    var email = $('#email').val();\n    var qq = $('#qq').val();\n    var wechat = $('#wechat').val();\n    var weibo = $('#weibo').val();\n    var phone = $('#phone').val();\n    var data = {};\n    data.sex = sex;\n    data.birthday =birthday==undefined? undefined : new Date(birthday.replace(/-/,\"/\")) ;\n    data.age = age;\n    data.identityCard = identity_card;\n    data.email = email;\n    data.qq = qq;\n    data.wechat = wechat;\n    data.weibo = weibo;\n    data.phone = phone;\n    data.headImage = headImage;\n    $.ajax({\n        type : \"POST\",\n        url : contextPath + \"/userinfo/saveUserinfo\",\n        data: data,\n        dataType: \"json\",\n        success : function (result) {\n            if (result.code == 000){\n                //成功\n                showAlert('保存成功');\n                setTimeout(function(){\n                    window.location.href=\"/projectoa/userinfo/userinfo\"\n                },2000);\n            }else {\n                //失败\n                showAlert(result.message);\n            }\n        }\n    });\n    \n}"
  },
  {
    "path": "src/main/resources/static/js/userinfo_detail.js",
    "content": "var vm = new Vue({\n    el : '#userinfo',\n    data : {\n        departments : [],\n        positions : [],\n        user : {},\n        userinfo : {},\n    },\n    methods : {\n        getPosition : getPosition,\n        getDepartment : getDepartment,\n        getUserinfo : getUserinfo,\n    },\n    created : getInit()\n\n})\n\nfunction getInit() {\n    getDepartment();\n    getPosition();\n    getUser();\n    getUserinfo();\n}\n\n//查询职位\nfunction getPosition() {\n    $.ajax({\n        type: \"POST\",\n        url: \"/projectoa/position/query\",\n        //data: {username:$(\"#username\").val(), content:$(\"#content\").val()},\n        //dataType: \"json\",\n        success: function(result){\n            vm.positions = result.value;\n        }\n    });\n}\n\n//查询部门\nfunction getDepartment() {\n    $.ajax({\n        type: \"POST\",\n        url: \"/projectoa/department/query\",\n        //data: {username:$(\"#username\").val(), content:$(\"#content\").val()},\n        //dataType: \"json\",\n        success: function(result){\n            vm.departments = result.value;\n        }\n    });\n}\n\n//用户回显\nfunction getUser() {\n    var url = window.location.href;\n    var index = url.lastIndexOf(\"\\/\");\n    var id  = url.substring(index + 1, url.length);\n    $.ajax({\n        type: \"POST\",\n        url: contextPath + \"/user/getUser\",\n        data: {'userID':id},\n        //dataType: \"json\",\n        success: function(result){\n            vm.user = result.value;\n        }\n    });\n\n}\n\n//用户信息回显\nfunction getUserinfo() {\n    var url = window.location.href;\n    var index = url.lastIndexOf(\"\\/\");\n    var id  = url.substring(index + 1, url.length);\n    $.ajax({\n        type : \"POST\",\n        url : contextPath + \"/user/userinfo/detail/\" + id,\n        success : function (result) {\n            vm.userinfo = result.value;\n            if (vm.userinfo.birthday != null){\n                vm.userinfo.birthday = vm.userinfo.birthday.substring(0, 10);\n            }\n        }\n    });\n\n}\n\n\n\n\n"
  },
  {
    "path": "src/main/resources/static/prism/prism.css",
    "content": "/* PrismJS 1.11.0\nhttp://prismjs.com/download.html?themes=prism-coy&languages=markup+css+clike+javascript+java&plugins=line-numbers */\n/**\n * prism.js Coy theme for JavaScript, CoffeeScript, CSS and HTML\n * Based on https://github.com/tshedor/workshop-wp-theme (Example: http://workshop.kansan.com/category/sessions/basics or http://workshop.timshedor.com/category/sessions/basics);\n * @author Tim  Shedor\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: black;\n\tbackground: none;\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tposition: relative;\n\tmargin: .5em 0;\n\toverflow: visible;\n\tpadding: 0;\n}\npre[class*=\"language-\"]>code {\n\tposition: relative;\n\tborder-left: 10px solid #358ccb;\n\tbox-shadow: -1px 0px 0px 0px #358ccb, 0px 0px 0px 1px #dfdfdf;\n\tbackground-color: #fdfdfd;\n\tbackground-image: linear-gradient(transparent 50%, rgba(69, 142, 209, 0.04) 50%);\n\tbackground-size: 3em 3em;\n\tbackground-origin: content-box;\n\tbackground-attachment: local;\n}\n\ncode[class*=\"language\"] {\n\tmax-height: inherit;\n\tpadding: 0 1em;\n\tdisplay: block;\n\toverflow: auto;\n}\n\n/* Margin bottom to accomodate shadow */\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground-color: #fdfdfd;\n\t-webkit-box-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tbox-sizing: border-box;\n\tmargin-bottom: 1em;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tposition: relative;\n\tpadding: .2em;\n\tborder-radius: 0.3em;\n\tcolor: #c92c2c;\n\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\tdisplay: inline;\n\twhite-space: normal;\n}\n\npre[class*=\"language-\"]:before,\npre[class*=\"language-\"]:after {\n\tcontent: '';\n\tz-index: -2;\n\tdisplay: block;\n\tposition: absolute;\n\tbottom: 0.75em;\n\tleft: 0.18em;\n\twidth: 40%;\n\theight: 20%;\n\tmax-height: 13em;\n\tbox-shadow: 0px 13px 8px #979797;\n\t-webkit-transform: rotate(-2deg);\n\t-moz-transform: rotate(-2deg);\n\t-ms-transform: rotate(-2deg);\n\t-o-transform: rotate(-2deg);\n\ttransform: rotate(-2deg);\n}\n\n:not(pre) > code[class*=\"language-\"]:after,\npre[class*=\"language-\"]:after {\n\tright: 0.75em;\n\tleft: auto;\n\t-webkit-transform: rotate(2deg);\n\t-moz-transform: rotate(2deg);\n\t-ms-transform: rotate(2deg);\n\t-o-transform: rotate(2deg);\n\ttransform: rotate(2deg);\n}\n\n.token.comment,\n.token.block-comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: #7D8B99;\n}\n\n.token.punctuation {\n\tcolor: #5F6364;\n}\n\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.function-name,\n.token.constant,\n.token.symbol,\n.token.deleted {\n\tcolor: #c92c2c;\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.function,\n.token.builtin,\n.token.inserted {\n\tcolor: #2f9c0a;\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.token.variable {\n\tcolor: #a67f59;\n\tbackground: rgba(255, 255, 255, 0.5);\n}\n\n.token.atrule,\n.token.attr-value,\n.token.keyword,\n.token.class-name {\n\tcolor: #1990b8;\n}\n\n.token.regex,\n.token.important {\n\tcolor: #e90;\n}\n\n.language-css .token.string,\n.style .token.string {\n\tcolor: #a67f59;\n\tbackground: rgba(255, 255, 255, 0.5);\n}\n\n.token.important {\n\tfont-weight: normal;\n}\n\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n\n.namespace {\n\topacity: .7;\n}\n\n@media screen and (max-width: 767px) {\n\tpre[class*=\"language-\"]:before,\n\tpre[class*=\"language-\"]:after {\n\t\tbottom: 14px;\n\t\tbox-shadow: none;\n\t}\n\n}\n\n/* Plugin styles */\n.token.tab:not(:empty):before,\n.token.cr:before,\n.token.lf:before {\n\tcolor: #e0d7d1;\n}\n\n/* Plugin styles: Line Numbers */\npre[class*=\"language-\"].line-numbers {\n\tpadding-left: 0;\n}\n\npre[class*=\"language-\"].line-numbers code {\n\tpadding-left: 3.8em;\n}\n\npre[class*=\"language-\"].line-numbers .line-numbers-rows {\n\tleft: 0;\n}\n\n/* Plugin styles: Line Highlight */\npre[class*=\"language-\"][data-line] {\n\tpadding-top: 0;\n\tpadding-bottom: 0;\n\tpadding-left: 0;\n}\npre[data-line] code {\n\tposition: relative;\n\tpadding-left: 4em;\n}\npre .line-highlight {\n\tmargin-top: 0;\n}\n\npre.line-numbers {\n\tposition: relative;\n\tpadding-left: 3.8em;\n\tcounter-reset: linenumber;\n}\n\npre.line-numbers > code {\n\tposition: relative;\n    white-space: inherit;\n}\n\n.line-numbers .line-numbers-rows {\n\tposition: absolute;\n\tpointer-events: none;\n\ttop: 0;\n\tfont-size: 100%;\n\tleft: -3.8em;\n\twidth: 3em; /* works for line-numbers below 1000 lines */\n\tletter-spacing: -1px;\n\tborder-right: 1px solid #999;\n\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\n}\n\n\t.line-numbers-rows > span {\n\t\tpointer-events: none;\n\t\tdisplay: block;\n\t\tcounter-increment: linenumber;\n\t}\n\n\t\t.line-numbers-rows > span:before {\n\t\t\tcontent: counter(linenumber);\n\t\t\tcolor: #999;\n\t\t\tdisplay: block;\n\t\t\tpadding-right: 0.8em;\n\t\t\ttext-align: right;\n\t\t}\n"
  },
  {
    "path": "src/main/resources/static/prism/prism.js",
    "content": "/* PrismJS 1.11.0\nhttp://prismjs.com/download.html?themes=prism-coy&languages=markup+css+clike+javascript+java&plugins=line-numbers */\nvar _self=\"undefined\"!=typeof window?window:\"undefined\"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\\blang(?:uage)?-(\\w+)\\b/i,t=0,n=_self.Prism={manual:_self.Prism&&_self.Prism.manual,disableWorkerMessageHandler:_self.Prism&&_self.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof r?new r(e.type,n.util.encode(e.content),e.alias):\"Array\"===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/\\u00a0/g,\" \")},type:function(e){return Object.prototype.toString.call(e).match(/\\[object (\\w+)\\]/)[1]},objId:function(e){return e.__id||Object.defineProperty(e,\"__id\",{value:++t}),e.__id},clone:function(e){var t=n.util.type(e);switch(t){case\"Object\":var r={};for(var a in e)e.hasOwnProperty(a)&&(r[a]=n.util.clone(e[a]));return r;case\"Array\":return e.map(function(e){return n.util.clone(e)})}return e}},languages:{extend:function(e,t){var r=n.util.clone(n.languages[e]);for(var a in t)r[a]=t[a];return r},insertBefore:function(e,t,r,a){a=a||n.languages;var l=a[e];if(2==arguments.length){r=arguments[1];for(var i in r)r.hasOwnProperty(i)&&(l[i]=r[i]);return l}var o={};for(var s in l)if(l.hasOwnProperty(s)){if(s==t)for(var i in r)r.hasOwnProperty(i)&&(o[i]=r[i]);o[s]=l[s]}return n.languages.DFS(n.languages,function(t,n){n===a[e]&&t!=e&&(this[t]=o)}),a[e]=o},DFS:function(e,t,r,a){a=a||{};for(var l in e)e.hasOwnProperty(l)&&(t.call(e,l,e[l],r||l),\"Object\"!==n.util.type(e[l])||a[n.util.objId(e[l])]?\"Array\"!==n.util.type(e[l])||a[n.util.objId(e[l])]||(a[n.util.objId(e[l])]=!0,n.languages.DFS(e[l],t,l,a)):(a[n.util.objId(e[l])]=!0,n.languages.DFS(e[l],t,null,a)))}},plugins:{},highlightAll:function(e,t){n.highlightAllUnder(document,e,t)},highlightAllUnder:function(e,t,r){var a={callback:r,selector:'code[class*=\"language-\"], [class*=\"language-\"] code, code[class*=\"lang-\"], [class*=\"lang-\"] code'};n.hooks.run(\"before-highlightall\",a);for(var l,i=a.elements||e.querySelectorAll(a.selector),o=0;l=i[o++];)n.highlightElement(l,t===!0,a.callback)},highlightElement:function(t,r,a){for(var l,i,o=t;o&&!e.test(o.className);)o=o.parentNode;o&&(l=(o.className.match(e)||[,\"\"])[1].toLowerCase(),i=n.languages[l]),t.className=t.className.replace(e,\"\").replace(/\\s+/g,\" \")+\" language-\"+l,t.parentNode&&(o=t.parentNode,/pre/i.test(o.nodeName)&&(o.className=o.className.replace(e,\"\").replace(/\\s+/g,\" \")+\" language-\"+l));var s=t.textContent,g={element:t,language:l,grammar:i,code:s};if(n.hooks.run(\"before-sanity-check\",g),!g.code||!g.grammar)return g.code&&(n.hooks.run(\"before-highlight\",g),g.element.textContent=g.code,n.hooks.run(\"after-highlight\",g)),n.hooks.run(\"complete\",g),void 0;if(n.hooks.run(\"before-highlight\",g),r&&_self.Worker){var u=new Worker(n.filename);u.onmessage=function(e){g.highlightedCode=e.data,n.hooks.run(\"before-insert\",g),g.element.innerHTML=g.highlightedCode,a&&a.call(g.element),n.hooks.run(\"after-highlight\",g),n.hooks.run(\"complete\",g)},u.postMessage(JSON.stringify({language:g.language,code:g.code,immediateClose:!0}))}else g.highlightedCode=n.highlight(g.code,g.grammar,g.language),n.hooks.run(\"before-insert\",g),g.element.innerHTML=g.highlightedCode,a&&a.call(t),n.hooks.run(\"after-highlight\",g),n.hooks.run(\"complete\",g)},highlight:function(e,t,a){var l=n.tokenize(e,t);return r.stringify(n.util.encode(l),a)},matchGrammar:function(e,t,r,a,l,i,o){var s=n.Token;for(var g in r)if(r.hasOwnProperty(g)&&r[g]){if(g==o)return;var u=r[g];u=\"Array\"===n.util.type(u)?u:[u];for(var c=0;c<u.length;++c){var h=u[c],f=h.inside,d=!!h.lookbehind,m=!!h.greedy,p=0,y=h.alias;if(m&&!h.pattern.global){var v=h.pattern.toString().match(/[imuy]*$/)[0];h.pattern=RegExp(h.pattern.source,v+\"g\")}h=h.pattern||h;for(var b=a,k=l;b<t.length;k+=t[b].length,++b){var w=t[b];if(t.length>e.length)return;if(!(w instanceof s)){h.lastIndex=0;var _=h.exec(w),P=1;if(!_&&m&&b!=t.length-1){if(h.lastIndex=k,_=h.exec(e),!_)break;for(var A=_.index+(d?_[1].length:0),j=_.index+_[0].length,x=b,O=k,N=t.length;N>x&&(j>O||!t[x].type&&!t[x-1].greedy);++x)O+=t[x].length,A>=O&&(++b,k=O);if(t[b]instanceof s||t[x-1].greedy)continue;P=x-b,w=e.slice(k,O),_.index-=k}if(_){d&&(p=_[1].length);var A=_.index+p,_=_[0].slice(p),j=A+_.length,S=w.slice(0,A),C=w.slice(j),M=[b,P];S&&(++b,k+=S.length,M.push(S));var E=new s(g,f?n.tokenize(_,f):_,y,_,m);if(M.push(E),C&&M.push(C),Array.prototype.splice.apply(t,M),1!=P&&n.matchGrammar(e,t,r,b,k,!0,g),i)break}else if(i)break}}}}},tokenize:function(e,t){var r=[e],a=t.rest;if(a){for(var l in a)t[l]=a[l];delete t.rest}return n.matchGrammar(e,r,t,0,0,!1),r},hooks:{all:{},add:function(e,t){var r=n.hooks.all;r[e]=r[e]||[],r[e].push(t)},run:function(e,t){var r=n.hooks.all[e];if(r&&r.length)for(var a,l=0;a=r[l++];)a(t)}}},r=n.Token=function(e,t,n,r,a){this.type=e,this.content=t,this.alias=n,this.length=0|(r||\"\").length,this.greedy=!!a};if(r.stringify=function(e,t,a){if(\"string\"==typeof e)return e;if(\"Array\"===n.util.type(e))return e.map(function(n){return r.stringify(n,t,e)}).join(\"\");var l={type:e.type,content:r.stringify(e.content,t,a),tag:\"span\",classes:[\"token\",e.type],attributes:{},language:t,parent:a};if(e.alias){var i=\"Array\"===n.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(l.classes,i)}n.hooks.run(\"wrap\",l);var o=Object.keys(l.attributes).map(function(e){return e+'=\"'+(l.attributes[e]||\"\").replace(/\"/g,\"&quot;\")+'\"'}).join(\" \");return\"<\"+l.tag+' class=\"'+l.classes.join(\" \")+'\"'+(o?\" \"+o:\"\")+\">\"+l.content+\"</\"+l.tag+\">\"},!_self.document)return _self.addEventListener?(n.disableWorkerMessageHandler||_self.addEventListener(\"message\",function(e){var t=JSON.parse(e.data),r=t.language,a=t.code,l=t.immediateClose;_self.postMessage(n.highlight(a,n.languages[r],r)),l&&_self.close()},!1),_self.Prism):_self.Prism;var a=document.currentScript||[].slice.call(document.getElementsByTagName(\"script\")).pop();return a&&(n.filename=a.src,n.manual||a.hasAttribute(\"data-manual\")||(\"loading\"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(n.highlightAll):window.setTimeout(n.highlightAll,16):document.addEventListener(\"DOMContentLoaded\",n.highlightAll))),_self.Prism}();\"undefined\"!=typeof module&&module.exports&&(module.exports=Prism),\"undefined\"!=typeof global&&(global.Prism=Prism);\nPrism.languages.markup={comment:/<!--[\\s\\S]*?-->/,prolog:/<\\?[\\s\\S]+?\\?>/,doctype:/<!DOCTYPE[\\s\\S]+?>/i,cdata:/<!\\[CDATA\\[[\\s\\S]*?]]>/i,tag:{pattern:/<\\/?(?!\\d)[^\\s>\\/=$<]+(?:\\s+[^\\s>\\/=]+(?:=(?:(\"|')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1|[^\\s'\">=]+))?)*\\s*\\/?>/i,inside:{tag:{pattern:/^<\\/?[^\\s>\\/]+/i,inside:{punctuation:/^<\\/?/,namespace:/^[^\\s>\\/:]+:/}},\"attr-value\":{pattern:/=(?:(\"|')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1|[^\\s'\">=]+)/i,inside:{punctuation:[/^=/,{pattern:/(^|[^\\\\])[\"']/,lookbehind:!0}]}},punctuation:/\\/?>/,\"attr-name\":{pattern:/[^\\s>\\/]+/,inside:{namespace:/^[^\\s>\\/:]+:/}}}},entity:/&#?[\\da-z]{1,8};/i},Prism.languages.markup.tag.inside[\"attr-value\"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add(\"wrap\",function(a){\"entity\"===a.type&&(a.attributes.title=a.content.replace(/&amp;/,\"&\"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup;\nPrism.languages.css={comment:/\\/\\*[\\s\\S]*?\\*\\//,atrule:{pattern:/@[\\w-]+?.*?(?:;|(?=\\s*\\{))/i,inside:{rule:/@[\\w-]+/}},url:/url\\((?:([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1|.*?)\\)/i,selector:/[^{}\\s][^{};]*?(?=\\s*\\{)/,string:{pattern:/(\"|')(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,greedy:!0},property:/[-_a-z\\xA0-\\uFFFF][-\\w\\xA0-\\uFFFF]*(?=\\s*:)/i,important:/\\B!important\\b/i,\"function\":/[-a-z0-9]+(?=\\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.util.clone(Prism.languages.css),Prism.languages.markup&&(Prism.languages.insertBefore(\"markup\",\"tag\",{style:{pattern:/(<style[\\s\\S]*?>)[\\s\\S]*?(?=<\\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:\"language-css\",greedy:!0}}),Prism.languages.insertBefore(\"inside\",\"attr-value\",{\"style-attr\":{pattern:/\\s*style=(\"|')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1/i,inside:{\"attr-name\":{pattern:/^\\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\\s*=\\s*['\"]|['\"]\\s*$/,\"attr-value\":{pattern:/.+/i,inside:Prism.languages.css}},alias:\"language-css\"}},Prism.languages.markup.tag));\nPrism.languages.clike={comment:[{pattern:/(^|[^\\\\])\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,lookbehind:!0},{pattern:/(^|[^\\\\:])\\/\\/.*/,lookbehind:!0}],string:{pattern:/([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,greedy:!0},\"class-name\":{pattern:/((?:\\b(?:class|interface|extends|implements|trait|instanceof|new)\\s+)|(?:catch\\s+\\())[\\w.\\\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\\\]/}},keyword:/\\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\\b/,\"boolean\":/\\b(?:true|false)\\b/,\"function\":/[a-z0-9_]+(?=\\()/i,number:/\\b-?(?:0x[\\da-f]+|\\d*\\.?\\d+(?:e[+-]?\\d+)?)\\b/i,operator:/--?|\\+\\+?|!=?=?|<=?|>=?|==?=?|&&?|\\|\\|?|\\?|\\*|\\/|~|\\^|%/,punctuation:/[{}[\\];(),.:]/};\nPrism.languages.javascript=Prism.languages.extend(\"clike\",{keyword:/\\b(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\\b/,number:/\\b-?(?:0[xX][\\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+|\\d*\\.?\\d+(?:[Ee][+-]?\\d+)?|NaN|Infinity)\\b/,\"function\":/[_$a-z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*(?=\\s*\\()/i,operator:/-[-=]?|\\+[+=]?|!=?=?|<<?=?|>>?>?=?|=(?:==?|>)?|&[&=]?|\\|[|=]?|\\*\\*?=?|\\/=?|~|\\^=?|%=?|\\?|\\.{3}/}),Prism.languages.insertBefore(\"javascript\",\"keyword\",{regex:{pattern:/(^|[^\\/])\\/(?!\\/)(\\[[^\\]\\r\\n]+]|\\\\.|[^\\/\\\\\\[\\r\\n])+\\/[gimyu]{0,5}(?=\\s*($|[\\r\\n,.;})]))/,lookbehind:!0,greedy:!0},\"function-variable\":{pattern:/[_$a-z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*(?=\\s*=\\s*(?:function\\b|(?:\\([^()]*\\)|[_$a-z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*)\\s*=>))/i,alias:\"function\"}}),Prism.languages.insertBefore(\"javascript\",\"string\",{\"template-string\":{pattern:/`(?:\\\\[\\s\\S]|[^\\\\`])*`/,greedy:!0,inside:{interpolation:{pattern:/\\$\\{[^}]+\\}/,inside:{\"interpolation-punctuation\":{pattern:/^\\$\\{|\\}$/,alias:\"punctuation\"},rest:Prism.languages.javascript}},string:/[\\s\\S]+/}}}),Prism.languages.markup&&Prism.languages.insertBefore(\"markup\",\"tag\",{script:{pattern:/(<script[\\s\\S]*?>)[\\s\\S]*?(?=<\\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:\"language-javascript\",greedy:!0}}),Prism.languages.js=Prism.languages.javascript;\nPrism.languages.java=Prism.languages.extend(\"clike\",{keyword:/\\b(?:abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while)\\b/,number:/\\b0b[01]+\\b|\\b0x[\\da-f]*\\.?[\\da-fp\\-]+\\b|\\b\\d*\\.?\\d+(?:e[+-]?\\d+)?[df]?\\b/i,operator:{pattern:/(^|[^.])(?:\\+[+=]?|-[-=]?|!=?|<<?=?|>>?>?=?|==?|&[&=]?|\\|[|=]?|\\*=?|\\/=?|%=?|\\^=?|[?:~])/m,lookbehind:!0}}),Prism.languages.insertBefore(\"java\",\"function\",{annotation:{alias:\"punctuation\",pattern:/(^|[^.])@\\w+/,lookbehind:!0}});\n!function(){if(\"undefined\"!=typeof self&&self.Prism&&self.document){var e=\"line-numbers\",t=/\\n(?!$)/g,n=function(e){var n=r(e),s=n[\"white-space\"];if(\"pre-wrap\"===s||\"pre-line\"===s){var l=e.querySelector(\"code\"),i=e.querySelector(\".line-numbers-rows\"),a=e.querySelector(\".line-numbers-sizer\"),o=l.textContent.split(t);a||(a=document.createElement(\"span\"),a.className=\"line-numbers-sizer\",l.appendChild(a)),a.style.display=\"block\",o.forEach(function(e,t){a.textContent=e||\"\\n\";var n=a.getBoundingClientRect().height;i.children[t].style.height=n+\"px\"}),a.textContent=\"\",a.style.display=\"none\"}},r=function(e){return e?window.getComputedStyle?getComputedStyle(e):e.currentStyle||null:null};window.addEventListener(\"resize\",function(){Array.prototype.forEach.call(document.querySelectorAll(\"pre.\"+e),n)}),Prism.hooks.add(\"complete\",function(e){if(e.code){var r=e.element.parentNode,s=/\\s*\\bline-numbers\\b\\s*/;if(r&&/pre/i.test(r.nodeName)&&(s.test(r.className)||s.test(e.element.className))&&!e.element.querySelector(\".line-numbers-rows\")){s.test(e.element.className)&&(e.element.className=e.element.className.replace(s,\" \")),s.test(r.className)||(r.className+=\" line-numbers\");var l,i=e.code.match(t),a=i?i.length+1:1,o=new Array(a+1);o=o.join(\"<span></span>\"),l=document.createElement(\"span\"),l.setAttribute(\"aria-hidden\",\"true\"),l.className=\"line-numbers-rows\",l.innerHTML=o,r.hasAttribute(\"data-start\")&&(r.style.counterReset=\"linenumber \"+(parseInt(r.getAttribute(\"data-start\"),10)-1)),e.element.appendChild(l),n(r),Prism.hooks.run(\"line-numbers\",e)}}}),Prism.hooks.add(\"line-numbers\",function(e){e.plugins=e.plugins||{},e.plugins.lineNumbers=!0}),Prism.plugins.lineNumbers={getLine:function(t,n){if(\"PRE\"===t.tagName&&t.classList.contains(e)){var r=t.querySelector(\".line-numbers-rows\"),s=parseInt(t.getAttribute(\"data-start\"),10)||1,l=s+(r.children.length-1);s>n&&(n=s),n>l&&(n=l);var i=n-s;return r.children[i]}}}}}();\n"
  },
  {
    "path": "src/main/resources/templates/mapper/CalendarMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.zmh.projectoa.mapper.CalendarMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.zmh.projectoa.model.Calendar\">\n    <id column=\"id\" jdbcType=\"INTEGER\" property=\"id\" />\n    <result column=\"user_id\" jdbcType=\"INTEGER\" property=\"userId\" />\n    <result column=\"title\" jdbcType=\"VARCHAR\" property=\"title\" />\n    <result column=\"start_time\" jdbcType=\"TIMESTAMP\" property=\"startTime\" />\n    <result column=\"end_time\" jdbcType=\"TIMESTAMP\" property=\"endTime\" />\n    <result column=\"create_time\" jdbcType=\"TIMESTAMP\" property=\"createTime\" />\n    <result column=\"update_time\" jdbcType=\"TIMESTAMP\" property=\"updateTime\" />\n  </resultMap>\n  <sql id=\"Example_Where_Clause\">\n    <where>\n      <foreach collection=\"oredCriteria\" item=\"criteria\" separator=\"or\">\n        <if test=\"criteria.valid\">\n          <trim prefix=\"(\" prefixOverrides=\"and\" suffix=\")\">\n            <foreach collection=\"criteria.criteria\" item=\"criterion\">\n              <choose>\n                <when test=\"criterion.noValue\">\n                  and ${criterion.condition}\n                </when>\n                <when test=\"criterion.singleValue\">\n                  and ${criterion.condition} #{criterion.value}\n                </when>\n                <when test=\"criterion.betweenValue\">\n                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}\n                </when>\n                <when test=\"criterion.listValue\">\n                  and ${criterion.condition}\n                  <foreach close=\")\" collection=\"criterion.value\" item=\"listItem\" open=\"(\" separator=\",\">\n                    #{listItem}\n                  </foreach>\n                </when>\n              </choose>\n            </foreach>\n          </trim>\n        </if>\n      </foreach>\n    </where>\n  </sql>\n  <sql id=\"Update_By_Example_Where_Clause\">\n    <where>\n      <foreach collection=\"example.oredCriteria\" item=\"criteria\" separator=\"or\">\n        <if test=\"criteria.valid\">\n          <trim prefix=\"(\" prefixOverrides=\"and\" suffix=\")\">\n            <foreach collection=\"criteria.criteria\" item=\"criterion\">\n              <choose>\n                <when test=\"criterion.noValue\">\n                  and ${criterion.condition}\n                </when>\n                <when test=\"criterion.singleValue\">\n                  and ${criterion.condition} #{criterion.value}\n                </when>\n                <when test=\"criterion.betweenValue\">\n                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}\n                </when>\n                <when test=\"criterion.listValue\">\n                  and ${criterion.condition}\n                  <foreach close=\")\" collection=\"criterion.value\" item=\"listItem\" open=\"(\" separator=\",\">\n                    #{listItem}\n                  </foreach>\n                </when>\n              </choose>\n            </foreach>\n          </trim>\n        </if>\n      </foreach>\n    </where>\n  </sql>\n  <sql id=\"Base_Column_List\">\n    id, user_id, title, start_time, end_time, create_time, update_time\n  </sql>\n  <select id=\"selectByExample\" parameterType=\"com.zmh.projectoa.model.CalendarExample\" resultMap=\"BaseResultMap\">\n    select\n    <if test=\"distinct\">\n      distinct\n    </if>\n    <include refid=\"Base_Column_List\" />\n    from calendar\n    <if test=\"_parameter != null\">\n      <include refid=\"Example_Where_Clause\" />\n    </if>\n    <if test=\"orderByClause != null\">\n      order by ${orderByClause}\n    </if>\n    <if test=\"limit != null\">\n      <if test=\"offset != null\">\n        limit ${offset}, ${limit}\n      </if>\n      <if test=\"offset == null\">\n        limit ${limit}\n      </if>\n    </if>\n  </select>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Integer\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from calendar\n    where id = #{id,jdbcType=INTEGER}\n  </select>\n  <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Integer\">\n    delete from calendar\n    where id = #{id,jdbcType=INTEGER}\n  </delete>\n  <delete id=\"deleteByExample\" parameterType=\"com.zmh.projectoa.model.CalendarExample\">\n    delete from calendar\n    <if test=\"_parameter != null\">\n      <include refid=\"Example_Where_Clause\" />\n    </if>\n  </delete>\n  <insert id=\"insert\" parameterType=\"com.zmh.projectoa.model.Calendar\">\n    <selectKey keyProperty=\"id\" order=\"AFTER\" resultType=\"java.lang.Integer\">\n      SELECT LAST_INSERT_ID()\n    </selectKey>\n    insert into calendar (user_id, title, start_time, \n      end_time, create_time, update_time\n      )\n    values (#{userId,jdbcType=INTEGER}, #{title,jdbcType=VARCHAR}, #{startTime,jdbcType=TIMESTAMP}, \n      #{endTime,jdbcType=TIMESTAMP}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}\n      )\n  </insert>\n  <insert id=\"insertSelective\" parameterType=\"com.zmh.projectoa.model.Calendar\">\n    <selectKey keyProperty=\"id\" order=\"AFTER\" resultType=\"java.lang.Integer\">\n      SELECT LAST_INSERT_ID()\n    </selectKey>\n    insert into calendar\n    <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n      <if test=\"userId != null\">\n        user_id,\n      </if>\n      <if test=\"title != null\">\n        title,\n      </if>\n      <if test=\"startTime != null\">\n        start_time,\n      </if>\n      <if test=\"endTime != null\">\n        end_time,\n      </if>\n      <if test=\"createTime != null\">\n        create_time,\n      </if>\n      <if test=\"updateTime != null\">\n        update_time,\n      </if>\n    </trim>\n    <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n      <if test=\"userId != null\">\n        #{userId,jdbcType=INTEGER},\n      </if>\n      <if test=\"title != null\">\n        #{title,jdbcType=VARCHAR},\n      </if>\n      <if test=\"startTime != null\">\n        #{startTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"endTime != null\">\n        #{endTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"createTime != null\">\n        #{createTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"updateTime != null\">\n        #{updateTime,jdbcType=TIMESTAMP},\n      </if>\n    </trim>\n  </insert>\n  <select id=\"countByExample\" parameterType=\"com.zmh.projectoa.model.CalendarExample\" resultType=\"java.lang.Long\">\n    select count(*) from calendar\n    <if test=\"_parameter != null\">\n      <include refid=\"Example_Where_Clause\" />\n    </if>\n  </select>\n  <update id=\"updateByExampleSelective\" parameterType=\"map\">\n    update calendar\n    <set>\n      <if test=\"record.id != null\">\n        id = #{record.id,jdbcType=INTEGER},\n      </if>\n      <if test=\"record.userId != null\">\n        user_id = #{record.userId,jdbcType=INTEGER},\n      </if>\n      <if test=\"record.title != null\">\n        title = #{record.title,jdbcType=VARCHAR},\n      </if>\n      <if test=\"record.startTime != null\">\n        start_time = #{record.startTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"record.endTime != null\">\n        end_time = #{record.endTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"record.createTime != null\">\n        create_time = #{record.createTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"record.updateTime != null\">\n        update_time = #{record.updateTime,jdbcType=TIMESTAMP},\n      </if>\n    </set>\n    <if test=\"_parameter != null\">\n      <include refid=\"Update_By_Example_Where_Clause\" />\n    </if>\n  </update>\n  <update id=\"updateByExample\" parameterType=\"map\">\n    update calendar\n    set id = #{record.id,jdbcType=INTEGER},\n      user_id = #{record.userId,jdbcType=INTEGER},\n      title = #{record.title,jdbcType=VARCHAR},\n      start_time = #{record.startTime,jdbcType=TIMESTAMP},\n      end_time = #{record.endTime,jdbcType=TIMESTAMP},\n      create_time = #{record.createTime,jdbcType=TIMESTAMP},\n      update_time = #{record.updateTime,jdbcType=TIMESTAMP}\n    <if test=\"_parameter != null\">\n      <include refid=\"Update_By_Example_Where_Clause\" />\n    </if>\n  </update>\n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.zmh.projectoa.model.Calendar\">\n    update calendar\n    <set>\n      <if test=\"userId != null\">\n        user_id = #{userId,jdbcType=INTEGER},\n      </if>\n      <if test=\"title != null\">\n        title = #{title,jdbcType=VARCHAR},\n      </if>\n      <if test=\"startTime != null\">\n        start_time = #{startTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"endTime != null\">\n        end_time = #{endTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"createTime != null\">\n        create_time = #{createTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"updateTime != null\">\n        update_time = #{updateTime,jdbcType=TIMESTAMP},\n      </if>\n    </set>\n    where id = #{id,jdbcType=INTEGER}\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.zmh.projectoa.model.Calendar\">\n    update calendar\n    set user_id = #{userId,jdbcType=INTEGER},\n      title = #{title,jdbcType=VARCHAR},\n      start_time = #{startTime,jdbcType=TIMESTAMP},\n      end_time = #{endTime,jdbcType=TIMESTAMP},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      update_time = #{updateTime,jdbcType=TIMESTAMP}\n    where id = #{id,jdbcType=INTEGER}\n  </update>\n</mapper>"
  },
  {
    "path": "src/main/resources/templates/mapper/DepartmentsMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.zmh.projectoa.mapper.DepartmentsMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.zmh.projectoa.model.Departments\">\n    <id column=\"id\" jdbcType=\"INTEGER\" property=\"id\" />\n    <result column=\"department\" jdbcType=\"VARCHAR\" property=\"department\" />\n    <result column=\"create_time\" jdbcType=\"TIMESTAMP\" property=\"createTime\" />\n    <result column=\"update_time\" jdbcType=\"TIMESTAMP\" property=\"updateTime\" />\n  </resultMap>\n  <sql id=\"Example_Where_Clause\">\n    <where>\n      <foreach collection=\"oredCriteria\" item=\"criteria\" separator=\"or\">\n        <if test=\"criteria.valid\">\n          <trim prefix=\"(\" prefixOverrides=\"and\" suffix=\")\">\n            <foreach collection=\"criteria.criteria\" item=\"criterion\">\n              <choose>\n                <when test=\"criterion.noValue\">\n                  and ${criterion.condition}\n                </when>\n                <when test=\"criterion.singleValue\">\n                  and ${criterion.condition} #{criterion.value}\n                </when>\n                <when test=\"criterion.betweenValue\">\n                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}\n                </when>\n                <when test=\"criterion.listValue\">\n                  and ${criterion.condition}\n                  <foreach close=\")\" collection=\"criterion.value\" item=\"listItem\" open=\"(\" separator=\",\">\n                    #{listItem}\n                  </foreach>\n                </when>\n              </choose>\n            </foreach>\n          </trim>\n        </if>\n      </foreach>\n    </where>\n  </sql>\n  <sql id=\"Update_By_Example_Where_Clause\">\n    <where>\n      <foreach collection=\"example.oredCriteria\" item=\"criteria\" separator=\"or\">\n        <if test=\"criteria.valid\">\n          <trim prefix=\"(\" prefixOverrides=\"and\" suffix=\")\">\n            <foreach collection=\"criteria.criteria\" item=\"criterion\">\n              <choose>\n                <when test=\"criterion.noValue\">\n                  and ${criterion.condition}\n                </when>\n                <when test=\"criterion.singleValue\">\n                  and ${criterion.condition} #{criterion.value}\n                </when>\n                <when test=\"criterion.betweenValue\">\n                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}\n                </when>\n                <when test=\"criterion.listValue\">\n                  and ${criterion.condition}\n                  <foreach close=\")\" collection=\"criterion.value\" item=\"listItem\" open=\"(\" separator=\",\">\n                    #{listItem}\n                  </foreach>\n                </when>\n              </choose>\n            </foreach>\n          </trim>\n        </if>\n      </foreach>\n    </where>\n  </sql>\n  <sql id=\"Base_Column_List\">\n    id, department, create_time, update_time\n  </sql>\n  <select id=\"selectByExample\" parameterType=\"com.zmh.projectoa.model.DepartmentsExample\" resultMap=\"BaseResultMap\">\n    select\n    <if test=\"distinct\">\n      distinct\n    </if>\n    <include refid=\"Base_Column_List\" />\n    from departments\n    <if test=\"_parameter != null\">\n      <include refid=\"Example_Where_Clause\" />\n    </if>\n    <if test=\"orderByClause != null\">\n      order by ${orderByClause}\n    </if>\n    <if test=\"limit != null\">\n      <if test=\"offset != null\">\n        limit ${offset}, ${limit}\n      </if>\n      <if test=\"offset == null\">\n        limit ${limit}\n      </if>\n    </if>\n  </select>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Integer\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from departments\n    where id = #{id,jdbcType=INTEGER}\n  </select>\n  <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Integer\">\n    delete from departments\n    where id = #{id,jdbcType=INTEGER}\n  </delete>\n  <delete id=\"deleteByExample\" parameterType=\"com.zmh.projectoa.model.DepartmentsExample\">\n    delete from departments\n    <if test=\"_parameter != null\">\n      <include refid=\"Example_Where_Clause\" />\n    </if>\n  </delete>\n  <insert id=\"insert\" parameterType=\"com.zmh.projectoa.model.Departments\">\n    <selectKey keyProperty=\"id\" order=\"AFTER\" resultType=\"java.lang.Integer\">\n      SELECT LAST_INSERT_ID()\n    </selectKey>\n    insert into departments (department, create_time, update_time\n      )\n    values (#{department,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}\n      )\n  </insert>\n  <insert id=\"insertSelective\" parameterType=\"com.zmh.projectoa.model.Departments\">\n    <selectKey keyProperty=\"id\" order=\"AFTER\" resultType=\"java.lang.Integer\">\n      SELECT LAST_INSERT_ID()\n    </selectKey>\n    insert into departments\n    <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n      <if test=\"department != null\">\n        department,\n      </if>\n      <if test=\"createTime != null\">\n        create_time,\n      </if>\n      <if test=\"updateTime != null\">\n        update_time,\n      </if>\n    </trim>\n    <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n      <if test=\"department != null\">\n        #{department,jdbcType=VARCHAR},\n      </if>\n      <if test=\"createTime != null\">\n        #{createTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"updateTime != null\">\n        #{updateTime,jdbcType=TIMESTAMP},\n      </if>\n    </trim>\n  </insert>\n  <select id=\"countByExample\" parameterType=\"com.zmh.projectoa.model.DepartmentsExample\" resultType=\"java.lang.Long\">\n    select count(*) from departments\n    <if test=\"_parameter != null\">\n      <include refid=\"Example_Where_Clause\" />\n    </if>\n  </select>\n  <update id=\"updateByExampleSelective\" parameterType=\"map\">\n    update departments\n    <set>\n      <if test=\"record.id != null\">\n        id = #{record.id,jdbcType=INTEGER},\n      </if>\n      <if test=\"record.department != null\">\n        department = #{record.department,jdbcType=VARCHAR},\n      </if>\n      <if test=\"record.createTime != null\">\n        create_time = #{record.createTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"record.updateTime != null\">\n        update_time = #{record.updateTime,jdbcType=TIMESTAMP},\n      </if>\n    </set>\n    <if test=\"_parameter != null\">\n      <include refid=\"Update_By_Example_Where_Clause\" />\n    </if>\n  </update>\n  <update id=\"updateByExample\" parameterType=\"map\">\n    update departments\n    set id = #{record.id,jdbcType=INTEGER},\n      department = #{record.department,jdbcType=VARCHAR},\n      create_time = #{record.createTime,jdbcType=TIMESTAMP},\n      update_time = #{record.updateTime,jdbcType=TIMESTAMP}\n    <if test=\"_parameter != null\">\n      <include refid=\"Update_By_Example_Where_Clause\" />\n    </if>\n  </update>\n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.zmh.projectoa.model.Departments\">\n    update departments\n    <set>\n      <if test=\"department != null\">\n        department = #{department,jdbcType=VARCHAR},\n      </if>\n      <if test=\"createTime != null\">\n        create_time = #{createTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"updateTime != null\">\n        update_time = #{updateTime,jdbcType=TIMESTAMP},\n      </if>\n    </set>\n    where id = #{id,jdbcType=INTEGER}\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.zmh.projectoa.model.Departments\">\n    update departments\n    set department = #{department,jdbcType=VARCHAR},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      update_time = #{updateTime,jdbcType=TIMESTAMP}\n    where id = #{id,jdbcType=INTEGER}\n  </update>\n</mapper>"
  },
  {
    "path": "src/main/resources/templates/mapper/MessagesMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.zmh.projectoa.mapper.MessagesMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.zmh.projectoa.model.Messages\">\n    <id column=\"id\" jdbcType=\"INTEGER\" property=\"id\" />\n    <result column=\"title\" jdbcType=\"VARCHAR\" property=\"title\" />\n    <result column=\"send_id\" jdbcType=\"INTEGER\" property=\"sendId\" />\n    <result column=\"receive_id\" jdbcType=\"INTEGER\" property=\"receiveId\" />\n    <result column=\"is_del\" jdbcType=\"VARCHAR\" property=\"isDel\" />\n    <result column=\"create_time\" jdbcType=\"TIMESTAMP\" property=\"createTime\" />\n    <result column=\"update_time\" jdbcType=\"TIMESTAMP\" property=\"updateTime\" />\n  </resultMap>\n  <resultMap extends=\"BaseResultMap\" id=\"ResultMapWithBLOBs\" type=\"com.zmh.projectoa.model.Messages\">\n    <result column=\"message\" jdbcType=\"LONGVARCHAR\" property=\"message\" />\n  </resultMap>\n  <sql id=\"Example_Where_Clause\">\n    <where>\n      <foreach collection=\"oredCriteria\" item=\"criteria\" separator=\"or\">\n        <if test=\"criteria.valid\">\n          <trim prefix=\"(\" prefixOverrides=\"and\" suffix=\")\">\n            <foreach collection=\"criteria.criteria\" item=\"criterion\">\n              <choose>\n                <when test=\"criterion.noValue\">\n                  and ${criterion.condition}\n                </when>\n                <when test=\"criterion.singleValue\">\n                  and ${criterion.condition} #{criterion.value}\n                </when>\n                <when test=\"criterion.betweenValue\">\n                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}\n                </when>\n                <when test=\"criterion.listValue\">\n                  and ${criterion.condition}\n                  <foreach close=\")\" collection=\"criterion.value\" item=\"listItem\" open=\"(\" separator=\",\">\n                    #{listItem}\n                  </foreach>\n                </when>\n              </choose>\n            </foreach>\n          </trim>\n        </if>\n      </foreach>\n    </where>\n  </sql>\n  <sql id=\"Update_By_Example_Where_Clause\">\n    <where>\n      <foreach collection=\"example.oredCriteria\" item=\"criteria\" separator=\"or\">\n        <if test=\"criteria.valid\">\n          <trim prefix=\"(\" prefixOverrides=\"and\" suffix=\")\">\n            <foreach collection=\"criteria.criteria\" item=\"criterion\">\n              <choose>\n                <when test=\"criterion.noValue\">\n                  and ${criterion.condition}\n                </when>\n                <when test=\"criterion.singleValue\">\n                  and ${criterion.condition} #{criterion.value}\n                </when>\n                <when test=\"criterion.betweenValue\">\n                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}\n                </when>\n                <when test=\"criterion.listValue\">\n                  and ${criterion.condition}\n                  <foreach close=\")\" collection=\"criterion.value\" item=\"listItem\" open=\"(\" separator=\",\">\n                    #{listItem}\n                  </foreach>\n                </when>\n              </choose>\n            </foreach>\n          </trim>\n        </if>\n      </foreach>\n    </where>\n  </sql>\n  <sql id=\"Base_Column_List\">\n    id, title, send_id, receive_id, is_del, create_time, update_time\n  </sql>\n  <sql id=\"Blob_Column_List\">\n    message\n  </sql>\n  <select id=\"selectByExampleWithBLOBs\" parameterType=\"com.zmh.projectoa.model.MessagesExample\" resultMap=\"ResultMapWithBLOBs\">\n    select\n    <if test=\"distinct\">\n      distinct\n    </if>\n    <include refid=\"Base_Column_List\" />\n    ,\n    <include refid=\"Blob_Column_List\" />\n    from messages\n    <if test=\"_parameter != null\">\n      <include refid=\"Example_Where_Clause\" />\n    </if>\n    <if test=\"orderByClause != null\">\n      order by ${orderByClause}\n    </if>\n  </select>\n  <select id=\"selectByExample\" parameterType=\"com.zmh.projectoa.model.MessagesExample\" resultMap=\"BaseResultMap\">\n    select\n    <if test=\"distinct\">\n      distinct\n    </if>\n    <include refid=\"Base_Column_List\" />\n    from messages\n    <if test=\"_parameter != null\">\n      <include refid=\"Example_Where_Clause\" />\n    </if>\n    <if test=\"orderByClause != null\">\n      order by ${orderByClause}\n    </if>\n    <if test=\"limit != null\">\n      <if test=\"offset != null\">\n        limit ${offset}, ${limit}\n      </if>\n      <if test=\"offset == null\">\n        limit ${limit}\n      </if>\n    </if>\n  </select>\n    <select id=\"selectLastOneByReceiveID\" resultType=\"java.util.Map\" parameterType=\"Integer\">\n        SELECT\n            messages.id,\n            messages.title,\n            messages.message,\n            messages.create_time,\n            users.realname\n        FROM\n            messages\n        INNER JOIN users ON users.id = messages.send_id\n        WHERE\n            messages.id = (\n                SELECT\n                    max(messages.id)\n                FROM\n                    messages\n                WHERE\n                    receive_id = #{ID}\n            )\n    </select>\n\n  <select id=\"selectByIDs\" resultType=\"java.util.Map\">\n      SELECT\n          messages.id,\n          messages.title,\n          messages.create_time,\n          users.realname\n      FROM\n          messages\n      INNER JOIN users ON messages.send_id = users.id\n      WHERE\n          messages.id IN\n      <foreach collection=\"list\" item=\"ID\"  open=\"(\" separator=\",\" close=\")\">\n          #{ID}\n      </foreach>\n      ORDER BY\n          messages.create_time DESC\n  </select>\n\n    <select id=\"selectByreceiveID\"  parameterType=\"java.lang.Integer\" resultType=\"java.util.Map\">\n        SELECT\n            messages.*,\n            users.realname\n        FROM\n            messages\n        INNER JOIN users ON messages.send_id = users.id\n        WHERE\n            messages.receive_id = #{ID}\n        ORDER BY\n            messages.create_time DESC\n    </select>\n\n\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Integer\" resultMap=\"ResultMapWithBLOBs\">\n    select\n    <include refid=\"Base_Column_List\" />\n    ,\n    <include refid=\"Blob_Column_List\" />\n    from messages\n    where id = #{id,jdbcType=INTEGER}\n  </select>\n\n  <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Integer\">\n    delete from messages\n    where id = #{id,jdbcType=INTEGER}\n  </delete>\n  <delete id=\"deleteByExample\" parameterType=\"com.zmh.projectoa.model.MessagesExample\">\n    delete from messages\n    <if test=\"_parameter != null\">\n      <include refid=\"Example_Where_Clause\" />\n    </if>\n  </delete>\n  <insert id=\"insert\" parameterType=\"com.zmh.projectoa.model.Messages\">\n    <selectKey keyProperty=\"id\" order=\"AFTER\" resultType=\"java.lang.Integer\">\n      SELECT LAST_INSERT_ID()\n    </selectKey>\n    insert into messages (title, send_id, receive_id, \n      is_del, create_time, update_time, \n      message)\n    values (#{title,jdbcType=VARCHAR}, #{sendId,jdbcType=INTEGER}, #{receiveId,jdbcType=INTEGER}, \n      #{isDel,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, \n      #{message,jdbcType=LONGVARCHAR})\n  </insert>\n  <insert id=\"insertSelective\" parameterType=\"com.zmh.projectoa.model.Messages\">\n    <selectKey keyProperty=\"id\" order=\"AFTER\" resultType=\"java.lang.Integer\">\n      SELECT LAST_INSERT_ID()\n    </selectKey>\n    insert into messages\n    <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n      <if test=\"title != null\">\n        title,\n      </if>\n      <if test=\"sendId != null\">\n        send_id,\n      </if>\n      <if test=\"receiveId != null\">\n        receive_id,\n      </if>\n      <if test=\"isDel != null\">\n        is_del,\n      </if>\n      <if test=\"createTime != null\">\n        create_time,\n      </if>\n      <if test=\"updateTime != null\">\n        update_time,\n      </if>\n      <if test=\"message != null\">\n        message,\n      </if>\n    </trim>\n    <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n      <if test=\"title != null\">\n        #{title,jdbcType=VARCHAR},\n      </if>\n      <if test=\"sendId != null\">\n        #{sendId,jdbcType=INTEGER},\n      </if>\n      <if test=\"receiveId != null\">\n        #{receiveId,jdbcType=INTEGER},\n      </if>\n      <if test=\"isDel != null\">\n        #{isDel,jdbcType=VARCHAR},\n      </if>\n      <if test=\"createTime != null\">\n        #{createTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"updateTime != null\">\n        #{updateTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"message != null\">\n        #{message,jdbcType=LONGVARCHAR},\n      </if>\n    </trim>\n  </insert>\n  <select id=\"countByExample\" parameterType=\"com.zmh.projectoa.model.MessagesExample\" resultType=\"java.lang.Long\">\n    select count(*) from messages\n    <if test=\"_parameter != null\">\n      <include refid=\"Example_Where_Clause\" />\n    </if>\n  </select>\n  <update id=\"updateByExampleSelective\" parameterType=\"map\">\n    update messages\n    <set>\n      <if test=\"record.id != null\">\n        id = #{record.id,jdbcType=INTEGER},\n      </if>\n      <if test=\"record.title != null\">\n        title = #{record.title,jdbcType=VARCHAR},\n      </if>\n      <if test=\"record.sendId != null\">\n        send_id = #{record.sendId,jdbcType=INTEGER},\n      </if>\n      <if test=\"record.receiveId != null\">\n        receive_id = #{record.receiveId,jdbcType=INTEGER},\n      </if>\n      <if test=\"record.isDel != null\">\n        is_del = #{record.isDel,jdbcType=VARCHAR},\n      </if>\n      <if test=\"record.createTime != null\">\n        create_time = #{record.createTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"record.updateTime != null\">\n        update_time = #{record.updateTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"record.message != null\">\n        message = #{record.message,jdbcType=LONGVARCHAR},\n      </if>\n    </set>\n    <if test=\"_parameter != null\">\n      <include refid=\"Update_By_Example_Where_Clause\" />\n    </if>\n  </update>\n  <update id=\"updateByExampleWithBLOBs\" parameterType=\"map\">\n    update messages\n    set id = #{record.id,jdbcType=INTEGER},\n      title = #{record.title,jdbcType=VARCHAR},\n      send_id = #{record.sendId,jdbcType=INTEGER},\n      receive_id = #{record.receiveId,jdbcType=INTEGER},\n      is_del = #{record.isDel,jdbcType=VARCHAR},\n      create_time = #{record.createTime,jdbcType=TIMESTAMP},\n      update_time = #{record.updateTime,jdbcType=TIMESTAMP},\n      message = #{record.message,jdbcType=LONGVARCHAR}\n    <if test=\"_parameter != null\">\n      <include refid=\"Update_By_Example_Where_Clause\" />\n    </if>\n  </update>\n  <update id=\"updateByExample\" parameterType=\"map\">\n    update messages\n    set id = #{record.id,jdbcType=INTEGER},\n      title = #{record.title,jdbcType=VARCHAR},\n      send_id = #{record.sendId,jdbcType=INTEGER},\n      receive_id = #{record.receiveId,jdbcType=INTEGER},\n      is_del = #{record.isDel,jdbcType=VARCHAR},\n      create_time = #{record.createTime,jdbcType=TIMESTAMP},\n      update_time = #{record.updateTime,jdbcType=TIMESTAMP}\n    <if test=\"_parameter != null\">\n      <include refid=\"Update_By_Example_Where_Clause\" />\n    </if>\n  </update>\n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.zmh.projectoa.model.Messages\">\n    update messages\n    <set>\n      <if test=\"title != null\">\n        title = #{title,jdbcType=VARCHAR},\n      </if>\n      <if test=\"sendId != null\">\n        send_id = #{sendId,jdbcType=INTEGER},\n      </if>\n      <if test=\"receiveId != null\">\n        receive_id = #{receiveId,jdbcType=INTEGER},\n      </if>\n      <if test=\"isDel != null\">\n        is_del = #{isDel,jdbcType=VARCHAR},\n      </if>\n      <if test=\"createTime != null\">\n        create_time = #{createTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"updateTime != null\">\n        update_time = #{updateTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"message != null\">\n        message = #{message,jdbcType=LONGVARCHAR},\n      </if>\n    </set>\n    where id = #{id,jdbcType=INTEGER}\n  </update>\n  <update id=\"updateByPrimaryKeyWithBLOBs\" parameterType=\"com.zmh.projectoa.model.Messages\">\n    update messages\n    set title = #{title,jdbcType=VARCHAR},\n      send_id = #{sendId,jdbcType=INTEGER},\n      receive_id = #{receiveId,jdbcType=INTEGER},\n      is_del = #{isDel,jdbcType=VARCHAR},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      update_time = #{updateTime,jdbcType=TIMESTAMP},\n      message = #{message,jdbcType=LONGVARCHAR}\n    where id = #{id,jdbcType=INTEGER}\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.zmh.projectoa.model.Messages\">\n    update messages\n    set title = #{title,jdbcType=VARCHAR},\n      send_id = #{sendId,jdbcType=INTEGER},\n      receive_id = #{receiveId,jdbcType=INTEGER},\n      is_del = #{isDel,jdbcType=VARCHAR},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      update_time = #{updateTime,jdbcType=TIMESTAMP}\n    where id = #{id,jdbcType=INTEGER}\n  </update>\n</mapper>"
  },
  {
    "path": "src/main/resources/templates/mapper/NoticesMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.zmh.projectoa.mapper.NoticesMapper\">\n    <resultMap id=\"BaseResultMap\" type=\"com.zmh.projectoa.model.Notices\">\n        <id column=\"id\" jdbcType=\"INTEGER\" property=\"id\"/>\n        <result column=\"title\" jdbcType=\"VARCHAR\" property=\"title\"/>\n        <result column=\"send_id\" jdbcType=\"INTEGER\" property=\"sendId\"/>\n        <result column=\"is_del\" jdbcType=\"VARCHAR\" property=\"isDel\"/>\n        <result column=\"create_time\" jdbcType=\"TIMESTAMP\" property=\"createTime\"/>\n        <result column=\"update_time\" jdbcType=\"TIMESTAMP\" property=\"updateTime\"/>\n    </resultMap>\n    <resultMap extends=\"BaseResultMap\" id=\"ResultMapWithBLOBs\" type=\"com.zmh.projectoa.model.Notices\">\n        <result column=\"notice\" jdbcType=\"LONGVARCHAR\" property=\"notice\"/>\n    </resultMap>\n    <sql id=\"Example_Where_Clause\">\n        <where>\n            <foreach collection=\"oredCriteria\" item=\"criteria\" separator=\"or\">\n                <if test=\"criteria.valid\">\n                    <trim prefix=\"(\" prefixOverrides=\"and\" suffix=\")\">\n                        <foreach collection=\"criteria.criteria\" item=\"criterion\">\n                            <choose>\n                                <when test=\"criterion.noValue\">\n                                    and ${criterion.condition}\n                                </when>\n                                <when test=\"criterion.singleValue\">\n                                    and ${criterion.condition} #{criterion.value}\n                                </when>\n                                <when test=\"criterion.betweenValue\">\n                                    and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}\n                                </when>\n                                <when test=\"criterion.listValue\">\n                                    and ${criterion.condition}\n                                    <foreach close=\")\" collection=\"criterion.value\" item=\"listItem\" open=\"(\"\n                                             separator=\",\">\n                                        #{listItem}\n                                    </foreach>\n                                </when>\n                            </choose>\n                        </foreach>\n                    </trim>\n                </if>\n            </foreach>\n        </where>\n    </sql>\n    <sql id=\"Update_By_Example_Where_Clause\">\n        <where>\n            <foreach collection=\"example.oredCriteria\" item=\"criteria\" separator=\"or\">\n                <if test=\"criteria.valid\">\n                    <trim prefix=\"(\" prefixOverrides=\"and\" suffix=\")\">\n                        <foreach collection=\"criteria.criteria\" item=\"criterion\">\n                            <choose>\n                                <when test=\"criterion.noValue\">\n                                    and ${criterion.condition}\n                                </when>\n                                <when test=\"criterion.singleValue\">\n                                    and ${criterion.condition} #{criterion.value}\n                                </when>\n                                <when test=\"criterion.betweenValue\">\n                                    and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}\n                                </when>\n                                <when test=\"criterion.listValue\">\n                                    and ${criterion.condition}\n                                    <foreach close=\")\" collection=\"criterion.value\" item=\"listItem\" open=\"(\"\n                                             separator=\",\">\n                                        #{listItem}\n                                    </foreach>\n                                </when>\n                            </choose>\n                        </foreach>\n                    </trim>\n                </if>\n            </foreach>\n        </where>\n    </sql>\n    <sql id=\"Base_Column_List\">\n    id, title, send_id, is_del, create_time, update_time\n  </sql>\n    <sql id=\"Blob_Column_List\">\n    notice\n  </sql>\n    <select id=\"selectByExampleWithBLOBs\" parameterType=\"com.zmh.projectoa.model.NoticesExample\"\n            resultMap=\"ResultMapWithBLOBs\">\n        select\n        <if test=\"distinct\">\n            distinct\n        </if>\n        <include refid=\"Base_Column_List\"/>\n        ,\n        <include refid=\"Blob_Column_List\"/>\n        from notices\n        <if test=\"_parameter != null\">\n            <include refid=\"Example_Where_Clause\"/>\n        </if>\n        <if test=\"orderByClause != null\">\n            order by ${orderByClause}\n        </if>\n    </select>\n    <select id=\"selectByExample\" parameterType=\"com.zmh.projectoa.model.NoticesExample\" resultMap=\"BaseResultMap\">\n        select\n        <if test=\"distinct\">\n            distinct\n        </if>\n        <include refid=\"Base_Column_List\"/>\n        from notices\n        <if test=\"_parameter != null\">\n            <include refid=\"Example_Where_Clause\"/>\n        </if>\n        <if test=\"orderByClause != null\">\n            order by ${orderByClause}\n        </if>\n        <if test=\"limit != null\">\n            <if test=\"offset != null\">\n                limit ${offset}, ${limit}\n            </if>\n            <if test=\"offset == null\">\n                limit ${limit}\n            </if>\n        </if>\n    </select>\n    <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Integer\" resultMap=\"ResultMapWithBLOBs\">\n        select\n        <include refid=\"Base_Column_List\"/>\n        ,\n        <include refid=\"Blob_Column_List\"/>\n        from notices\n        where id = #{id,jdbcType=INTEGER}\n    </select>\n    <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Integer\">\n    delete from notices\n    where id = #{id,jdbcType=INTEGER}\n  </delete>\n    <delete id=\"deleteByExample\" parameterType=\"com.zmh.projectoa.model.NoticesExample\">\n        delete from notices\n        <if test=\"_parameter != null\">\n            <include refid=\"Example_Where_Clause\"/>\n        </if>\n    </delete>\n    <insert id=\"insert\" parameterType=\"com.zmh.projectoa.model.Notices\">\n        <selectKey keyProperty=\"id\" order=\"AFTER\" resultType=\"java.lang.Integer\">\n            SELECT LAST_INSERT_ID()\n        </selectKey>\n        insert into notices (title, send_id, is_del,\n        create_time, update_time, notice\n        )\n        values (#{title,jdbcType=VARCHAR}, #{sendId,jdbcType=INTEGER}, #{isDel,jdbcType=VARCHAR},\n        #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}, #{notice,jdbcType=LONGVARCHAR}\n        )\n    </insert>\n    <insert id=\"insertSelective\" parameterType=\"com.zmh.projectoa.model.Notices\">\n        <selectKey keyProperty=\"id\" order=\"AFTER\" resultType=\"java.lang.Integer\">\n            SELECT LAST_INSERT_ID()\n        </selectKey>\n        insert into notices\n        <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"title != null\">\n                title,\n            </if>\n            <if test=\"sendId != null\">\n                send_id,\n            </if>\n            <if test=\"isDel != null\">\n                is_del,\n            </if>\n            <if test=\"createTime != null\">\n                create_time,\n            </if>\n            <if test=\"updateTime != null\">\n                update_time,\n            </if>\n            <if test=\"notice != null\">\n                notice,\n            </if>\n        </trim>\n        <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n            <if test=\"title != null\">\n                #{title,jdbcType=VARCHAR},\n            </if>\n            <if test=\"sendId != null\">\n                #{sendId,jdbcType=INTEGER},\n            </if>\n            <if test=\"isDel != null\">\n                #{isDel,jdbcType=VARCHAR},\n            </if>\n            <if test=\"createTime != null\">\n                #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateTime != null\">\n                #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"notice != null\">\n                #{notice,jdbcType=LONGVARCHAR},\n            </if>\n        </trim>\n    </insert>\n    <select id=\"countByExample\" parameterType=\"com.zmh.projectoa.model.NoticesExample\" resultType=\"java.lang.Long\">\n        select count(*) from notices\n        <if test=\"_parameter != null\">\n            <include refid=\"Example_Where_Clause\"/>\n        </if>\n    </select>\n    <update id=\"updateByExampleSelective\" parameterType=\"map\">\n        update notices\n        <set>\n            <if test=\"record.id != null\">\n                id = #{record.id,jdbcType=INTEGER},\n            </if>\n            <if test=\"record.title != null\">\n                title = #{record.title,jdbcType=VARCHAR},\n            </if>\n            <if test=\"record.sendId != null\">\n                send_id = #{record.sendId,jdbcType=INTEGER},\n            </if>\n            <if test=\"record.isDel != null\">\n                is_del = #{record.isDel,jdbcType=VARCHAR},\n            </if>\n            <if test=\"record.createTime != null\">\n                create_time = #{record.createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"record.updateTime != null\">\n                update_time = #{record.updateTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"record.notice != null\">\n                notice = #{record.notice,jdbcType=LONGVARCHAR},\n            </if>\n        </set>\n        <if test=\"_parameter != null\">\n            <include refid=\"Update_By_Example_Where_Clause\"/>\n        </if>\n    </update>\n    <update id=\"updateByExampleWithBLOBs\" parameterType=\"map\">\n        update notices\n        set id = #{record.id,jdbcType=INTEGER},\n        title = #{record.title,jdbcType=VARCHAR},\n        send_id = #{record.sendId,jdbcType=INTEGER},\n        is_del = #{record.isDel,jdbcType=VARCHAR},\n        create_time = #{record.createTime,jdbcType=TIMESTAMP},\n        update_time = #{record.updateTime,jdbcType=TIMESTAMP},\n        notice = #{record.notice,jdbcType=LONGVARCHAR}\n        <if test=\"_parameter != null\">\n            <include refid=\"Update_By_Example_Where_Clause\"/>\n        </if>\n    </update>\n    <update id=\"updateByExample\" parameterType=\"map\">\n        update notices\n        set id = #{record.id,jdbcType=INTEGER},\n        title = #{record.title,jdbcType=VARCHAR},\n        send_id = #{record.sendId,jdbcType=INTEGER},\n        is_del = #{record.isDel,jdbcType=VARCHAR},\n        create_time = #{record.createTime,jdbcType=TIMESTAMP},\n        update_time = #{record.updateTime,jdbcType=TIMESTAMP}\n        <if test=\"_parameter != null\">\n            <include refid=\"Update_By_Example_Where_Clause\"/>\n        </if>\n    </update>\n    <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.zmh.projectoa.model.Notices\">\n        update notices\n        <set>\n            <if test=\"title != null\">\n                title = #{title,jdbcType=VARCHAR},\n            </if>\n            <if test=\"sendId != null\">\n                send_id = #{sendId,jdbcType=INTEGER},\n            </if>\n            <if test=\"isDel != null\">\n                is_del = #{isDel,jdbcType=VARCHAR},\n            </if>\n            <if test=\"createTime != null\">\n                create_time = #{createTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime,jdbcType=TIMESTAMP},\n            </if>\n            <if test=\"notice != null\">\n                notice = #{notice,jdbcType=LONGVARCHAR},\n            </if>\n        </set>\n        where id = #{id,jdbcType=INTEGER}\n    </update>\n    <update id=\"updateByPrimaryKeyWithBLOBs\" parameterType=\"com.zmh.projectoa.model.Notices\">\n    update notices\n    set title = #{title,jdbcType=VARCHAR},\n      send_id = #{sendId,jdbcType=INTEGER},\n      is_del = #{isDel,jdbcType=VARCHAR},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      update_time = #{updateTime,jdbcType=TIMESTAMP},\n      notice = #{notice,jdbcType=LONGVARCHAR}\n    where id = #{id,jdbcType=INTEGER}\n  </update>\n    <update id=\"updateByPrimaryKey\" parameterType=\"com.zmh.projectoa.model.Notices\">\n    update notices\n    set title = #{title,jdbcType=VARCHAR},\n      send_id = #{sendId,jdbcType=INTEGER},\n      is_del = #{isDel,jdbcType=VARCHAR},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      update_time = #{updateTime,jdbcType=TIMESTAMP}\n    where id = #{id,jdbcType=INTEGER}\n  </update>\n\n    <select id=\"selectLastOneByReceiveID\" resultType=\"java.util.Map\">\n        SELECT\n            notices.id,\n            notices.title,\n            notices.notice,\n            notices.create_time,\n            users.realname\n        FROM\n            notices\n        INNER JOIN users ON users.id = notices.send_id\n        WHERE\n            notices.id = (\n                SELECT\n                    max(notices.id)\n                FROM\n                    notices\n            )\n    </select>\n\n    <select id=\"selectAllNotice\" resultType=\"java.util.Map\">\n    SELECT\n        notices.*,\n        users.realname\n    FROM\n        notices\n    INNER JOIN users ON notices.send_id = users.id\n    ORDER BY\n        notices.create_time DESC\n  </select>\n\n    <select id=\"selectByIDs\" resultType=\"java.util.Map\">\n        SELECT\n        notices.id,\n        notices.title,\n        notices.create_time,\n        users.realname\n        FROM\n        notices\n        INNER JOIN users ON notices.send_id = users.id\n        WHERE\n        notices.id IN\n        <foreach collection=\"list\" item=\"ID\" open=\"(\" separator=\",\" close=\")\">\n            #{ID}\n        </foreach>\n        ORDER BY\n        notices.create_time DESC\n    </select>\n\n</mapper>"
  },
  {
    "path": "src/main/resources/templates/mapper/PositionsMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.zmh.projectoa.mapper.PositionsMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.zmh.projectoa.model.Positions\">\n    <id column=\"id\" jdbcType=\"INTEGER\" property=\"id\" />\n    <result column=\"position\" jdbcType=\"VARCHAR\" property=\"position\" />\n    <result column=\"create_time\" jdbcType=\"TIMESTAMP\" property=\"createTime\" />\n    <result column=\"update_time\" jdbcType=\"TIMESTAMP\" property=\"updateTime\" />\n  </resultMap>\n  <sql id=\"Example_Where_Clause\">\n    <where>\n      <foreach collection=\"oredCriteria\" item=\"criteria\" separator=\"or\">\n        <if test=\"criteria.valid\">\n          <trim prefix=\"(\" prefixOverrides=\"and\" suffix=\")\">\n            <foreach collection=\"criteria.criteria\" item=\"criterion\">\n              <choose>\n                <when test=\"criterion.noValue\">\n                  and ${criterion.condition}\n                </when>\n                <when test=\"criterion.singleValue\">\n                  and ${criterion.condition} #{criterion.value}\n                </when>\n                <when test=\"criterion.betweenValue\">\n                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}\n                </when>\n                <when test=\"criterion.listValue\">\n                  and ${criterion.condition}\n                  <foreach close=\")\" collection=\"criterion.value\" item=\"listItem\" open=\"(\" separator=\",\">\n                    #{listItem}\n                  </foreach>\n                </when>\n              </choose>\n            </foreach>\n          </trim>\n        </if>\n      </foreach>\n    </where>\n  </sql>\n  <sql id=\"Update_By_Example_Where_Clause\">\n    <where>\n      <foreach collection=\"example.oredCriteria\" item=\"criteria\" separator=\"or\">\n        <if test=\"criteria.valid\">\n          <trim prefix=\"(\" prefixOverrides=\"and\" suffix=\")\">\n            <foreach collection=\"criteria.criteria\" item=\"criterion\">\n              <choose>\n                <when test=\"criterion.noValue\">\n                  and ${criterion.condition}\n                </when>\n                <when test=\"criterion.singleValue\">\n                  and ${criterion.condition} #{criterion.value}\n                </when>\n                <when test=\"criterion.betweenValue\">\n                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}\n                </when>\n                <when test=\"criterion.listValue\">\n                  and ${criterion.condition}\n                  <foreach close=\")\" collection=\"criterion.value\" item=\"listItem\" open=\"(\" separator=\",\">\n                    #{listItem}\n                  </foreach>\n                </when>\n              </choose>\n            </foreach>\n          </trim>\n        </if>\n      </foreach>\n    </where>\n  </sql>\n  <sql id=\"Base_Column_List\">\n    id, position, create_time, update_time\n  </sql>\n  <select id=\"selectByExample\" parameterType=\"com.zmh.projectoa.model.PositionsExample\" resultMap=\"BaseResultMap\">\n    select\n    <if test=\"distinct\">\n      distinct\n    </if>\n    <include refid=\"Base_Column_List\" />\n    from positions\n    <if test=\"_parameter != null\">\n      <include refid=\"Example_Where_Clause\" />\n    </if>\n    <if test=\"orderByClause != null\">\n      order by ${orderByClause}\n    </if>\n    <if test=\"limit != null\">\n      <if test=\"offset != null\">\n        limit ${offset}, ${limit}\n      </if>\n      <if test=\"offset == null\">\n        limit ${limit}\n      </if>\n    </if>\n  </select>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Integer\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from positions\n    where id = #{id,jdbcType=INTEGER}\n  </select>\n  <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Integer\">\n    delete from positions\n    where id = #{id,jdbcType=INTEGER}\n  </delete>\n  <delete id=\"deleteByExample\" parameterType=\"com.zmh.projectoa.model.PositionsExample\">\n    delete from positions\n    <if test=\"_parameter != null\">\n      <include refid=\"Example_Where_Clause\" />\n    </if>\n  </delete>\n  <insert id=\"insert\" parameterType=\"com.zmh.projectoa.model.Positions\">\n    <selectKey keyProperty=\"id\" order=\"AFTER\" resultType=\"java.lang.Integer\">\n      SELECT LAST_INSERT_ID()\n    </selectKey>\n    insert into positions (position, create_time, update_time\n      )\n    values (#{position,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}\n      )\n  </insert>\n  <insert id=\"insertSelective\" parameterType=\"com.zmh.projectoa.model.Positions\">\n    <selectKey keyProperty=\"id\" order=\"AFTER\" resultType=\"java.lang.Integer\">\n      SELECT LAST_INSERT_ID()\n    </selectKey>\n    insert into positions\n    <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n      <if test=\"position != null\">\n        position,\n      </if>\n      <if test=\"createTime != null\">\n        create_time,\n      </if>\n      <if test=\"updateTime != null\">\n        update_time,\n      </if>\n    </trim>\n    <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n      <if test=\"position != null\">\n        #{position,jdbcType=VARCHAR},\n      </if>\n      <if test=\"createTime != null\">\n        #{createTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"updateTime != null\">\n        #{updateTime,jdbcType=TIMESTAMP},\n      </if>\n    </trim>\n  </insert>\n  <select id=\"countByExample\" parameterType=\"com.zmh.projectoa.model.PositionsExample\" resultType=\"java.lang.Long\">\n    select count(*) from positions\n    <if test=\"_parameter != null\">\n      <include refid=\"Example_Where_Clause\" />\n    </if>\n  </select>\n  <update id=\"updateByExampleSelective\" parameterType=\"map\">\n    update positions\n    <set>\n      <if test=\"record.id != null\">\n        id = #{record.id,jdbcType=INTEGER},\n      </if>\n      <if test=\"record.position != null\">\n        position = #{record.position,jdbcType=VARCHAR},\n      </if>\n      <if test=\"record.createTime != null\">\n        create_time = #{record.createTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"record.updateTime != null\">\n        update_time = #{record.updateTime,jdbcType=TIMESTAMP},\n      </if>\n    </set>\n    <if test=\"_parameter != null\">\n      <include refid=\"Update_By_Example_Where_Clause\" />\n    </if>\n  </update>\n  <update id=\"updateByExample\" parameterType=\"map\">\n    update positions\n    set id = #{record.id,jdbcType=INTEGER},\n      position = #{record.position,jdbcType=VARCHAR},\n      create_time = #{record.createTime,jdbcType=TIMESTAMP},\n      update_time = #{record.updateTime,jdbcType=TIMESTAMP}\n    <if test=\"_parameter != null\">\n      <include refid=\"Update_By_Example_Where_Clause\" />\n    </if>\n  </update>\n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.zmh.projectoa.model.Positions\">\n    update positions\n    <set>\n      <if test=\"position != null\">\n        position = #{position,jdbcType=VARCHAR},\n      </if>\n      <if test=\"createTime != null\">\n        create_time = #{createTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"updateTime != null\">\n        update_time = #{updateTime,jdbcType=TIMESTAMP},\n      </if>\n    </set>\n    where id = #{id,jdbcType=INTEGER}\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.zmh.projectoa.model.Positions\">\n    update positions\n    set position = #{position,jdbcType=VARCHAR},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      update_time = #{updateTime,jdbcType=TIMESTAMP}\n    where id = #{id,jdbcType=INTEGER}\n  </update>\n</mapper>"
  },
  {
    "path": "src/main/resources/templates/mapper/UserinfoMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.zmh.projectoa.mapper.UserinfoMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.zmh.projectoa.model.Userinfo\">\n    <id column=\"id\" jdbcType=\"INTEGER\" property=\"id\" />\n    <result column=\"user_id\" jdbcType=\"INTEGER\" property=\"userId\" />\n    <result column=\"sex\" jdbcType=\"VARCHAR\" property=\"sex\" />\n    <result column=\"birthday\" jdbcType=\"DATE\" property=\"birthday\" />\n    <result column=\"age\" jdbcType=\"INTEGER\" property=\"age\" />\n    <result column=\"identity_card\" jdbcType=\"VARCHAR\" property=\"identityCard\" />\n    <result column=\"email\" jdbcType=\"VARCHAR\" property=\"email\" />\n    <result column=\"qq\" jdbcType=\"INTEGER\" property=\"qq\" />\n    <result column=\"wechat\" jdbcType=\"VARCHAR\" property=\"wechat\" />\n    <result column=\"weibo\" jdbcType=\"VARCHAR\" property=\"weibo\" />\n    <result column=\"phone\" jdbcType=\"VARCHAR\" property=\"phone\" />\n    <result column=\"is_del\" jdbcType=\"VARCHAR\" property=\"isDel\" />\n    <result column=\"create_time\" jdbcType=\"TIMESTAMP\" property=\"createTime\" />\n    <result column=\"update_time\" jdbcType=\"TIMESTAMP\" property=\"updateTime\" />\n  </resultMap>\n  <sql id=\"Example_Where_Clause\">\n    <where>\n      <foreach collection=\"oredCriteria\" item=\"criteria\" separator=\"or\">\n        <if test=\"criteria.valid\">\n          <trim prefix=\"(\" prefixOverrides=\"and\" suffix=\")\">\n            <foreach collection=\"criteria.criteria\" item=\"criterion\">\n              <choose>\n                <when test=\"criterion.noValue\">\n                  and ${criterion.condition}\n                </when>\n                <when test=\"criterion.singleValue\">\n                  and ${criterion.condition} #{criterion.value}\n                </when>\n                <when test=\"criterion.betweenValue\">\n                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}\n                </when>\n                <when test=\"criterion.listValue\">\n                  and ${criterion.condition}\n                  <foreach close=\")\" collection=\"criterion.value\" item=\"listItem\" open=\"(\" separator=\",\">\n                    #{listItem}\n                  </foreach>\n                </when>\n              </choose>\n            </foreach>\n          </trim>\n        </if>\n      </foreach>\n    </where>\n  </sql>\n  <sql id=\"Update_By_Example_Where_Clause\">\n    <where>\n      <foreach collection=\"example.oredCriteria\" item=\"criteria\" separator=\"or\">\n        <if test=\"criteria.valid\">\n          <trim prefix=\"(\" prefixOverrides=\"and\" suffix=\")\">\n            <foreach collection=\"criteria.criteria\" item=\"criterion\">\n              <choose>\n                <when test=\"criterion.noValue\">\n                  and ${criterion.condition}\n                </when>\n                <when test=\"criterion.singleValue\">\n                  and ${criterion.condition} #{criterion.value}\n                </when>\n                <when test=\"criterion.betweenValue\">\n                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}\n                </when>\n                <when test=\"criterion.listValue\">\n                  and ${criterion.condition}\n                  <foreach close=\")\" collection=\"criterion.value\" item=\"listItem\" open=\"(\" separator=\",\">\n                    #{listItem}\n                  </foreach>\n                </when>\n              </choose>\n            </foreach>\n          </trim>\n        </if>\n      </foreach>\n    </where>\n  </sql>\n  <sql id=\"Base_Column_List\">\n    id, user_id, sex, birthday, age, identity_card, email, qq, wechat, weibo, phone, \n    is_del, create_time, update_time\n  </sql>\n  <select id=\"selectByExample\" parameterType=\"com.zmh.projectoa.model.UserinfoExample\" resultMap=\"BaseResultMap\">\n    select\n    <if test=\"distinct\">\n      distinct\n    </if>\n    <include refid=\"Base_Column_List\" />\n    from userinfo\n    <if test=\"_parameter != null\">\n      <include refid=\"Example_Where_Clause\" />\n    </if>\n    <if test=\"orderByClause != null\">\n      order by ${orderByClause}\n    </if>\n    <if test=\"limit != null\">\n      <if test=\"offset != null\">\n        limit ${offset}, ${limit}\n      </if>\n      <if test=\"offset == null\">\n        limit ${limit}\n      </if>\n    </if>\n  </select>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Integer\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from userinfo\n    where id = #{id,jdbcType=INTEGER}\n  </select>\n  <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Integer\">\n    delete from userinfo\n    where id = #{id,jdbcType=INTEGER}\n  </delete>\n  <delete id=\"deleteByExample\" parameterType=\"com.zmh.projectoa.model.UserinfoExample\">\n    delete from userinfo\n    <if test=\"_parameter != null\">\n      <include refid=\"Example_Where_Clause\" />\n    </if>\n  </delete>\n  <insert id=\"insert\" parameterType=\"com.zmh.projectoa.model.Userinfo\">\n    <selectKey keyProperty=\"id\" order=\"AFTER\" resultType=\"java.lang.Integer\">\n      SELECT LAST_INSERT_ID()\n    </selectKey>\n    insert into userinfo (user_id, sex, birthday, \n      age, identity_card, email, \n      qq, wechat, weibo, \n      phone, is_del, create_time, \n      update_time)\n    values (#{userId,jdbcType=INTEGER}, #{sex,jdbcType=VARCHAR}, #{birthday,jdbcType=DATE}, \n      #{age,jdbcType=INTEGER}, #{identityCard,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR}, \n      #{qq,jdbcType=INTEGER}, #{wechat,jdbcType=VARCHAR}, #{weibo,jdbcType=VARCHAR}, \n      #{phone,jdbcType=VARCHAR}, #{isDel,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, \n      #{updateTime,jdbcType=TIMESTAMP})\n  </insert>\n  <insert id=\"insertSelective\" parameterType=\"com.zmh.projectoa.model.Userinfo\">\n    <selectKey keyProperty=\"id\" order=\"AFTER\" resultType=\"java.lang.Integer\">\n      SELECT LAST_INSERT_ID()\n    </selectKey>\n    insert into userinfo\n    <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n      <if test=\"userId != null\">\n        user_id,\n      </if>\n      <if test=\"sex != null\">\n        sex,\n      </if>\n      <if test=\"birthday != null\">\n        birthday,\n      </if>\n      <if test=\"age != null\">\n        age,\n      </if>\n      <if test=\"identityCard != null\">\n        identity_card,\n      </if>\n      <if test=\"email != null\">\n        email,\n      </if>\n      <if test=\"qq != null\">\n        qq,\n      </if>\n      <if test=\"wechat != null\">\n        wechat,\n      </if>\n      <if test=\"weibo != null\">\n        weibo,\n      </if>\n      <if test=\"phone != null\">\n        phone,\n      </if>\n      <if test=\"isDel != null\">\n        is_del,\n      </if>\n      <if test=\"createTime != null\">\n        create_time,\n      </if>\n      <if test=\"updateTime != null\">\n        update_time,\n      </if>\n    </trim>\n    <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n      <if test=\"userId != null\">\n        #{userId,jdbcType=INTEGER},\n      </if>\n      <if test=\"sex != null\">\n        #{sex,jdbcType=VARCHAR},\n      </if>\n      <if test=\"birthday != null\">\n        #{birthday,jdbcType=DATE},\n      </if>\n      <if test=\"age != null\">\n        #{age,jdbcType=INTEGER},\n      </if>\n      <if test=\"identityCard != null\">\n        #{identityCard,jdbcType=VARCHAR},\n      </if>\n      <if test=\"email != null\">\n        #{email,jdbcType=VARCHAR},\n      </if>\n      <if test=\"qq != null\">\n        #{qq,jdbcType=INTEGER},\n      </if>\n      <if test=\"wechat != null\">\n        #{wechat,jdbcType=VARCHAR},\n      </if>\n      <if test=\"weibo != null\">\n        #{weibo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"phone != null\">\n        #{phone,jdbcType=VARCHAR},\n      </if>\n      <if test=\"isDel != null\">\n        #{isDel,jdbcType=VARCHAR},\n      </if>\n      <if test=\"createTime != null\">\n        #{createTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"updateTime != null\">\n        #{updateTime,jdbcType=TIMESTAMP},\n      </if>\n    </trim>\n  </insert>\n  <select id=\"countByExample\" parameterType=\"com.zmh.projectoa.model.UserinfoExample\" resultType=\"java.lang.Long\">\n    select count(*) from userinfo\n    <if test=\"_parameter != null\">\n      <include refid=\"Example_Where_Clause\" />\n    </if>\n  </select>\n  <update id=\"updateByExampleSelective\" parameterType=\"map\">\n    update userinfo\n    <set>\n      <if test=\"record.id != null\">\n        id = #{record.id,jdbcType=INTEGER},\n      </if>\n      <if test=\"record.userId != null\">\n        user_id = #{record.userId,jdbcType=INTEGER},\n      </if>\n      <if test=\"record.sex != null\">\n        sex = #{record.sex,jdbcType=VARCHAR},\n      </if>\n      <if test=\"record.birthday != null\">\n        birthday = #{record.birthday,jdbcType=DATE},\n      </if>\n      <if test=\"record.age != null\">\n        age = #{record.age,jdbcType=INTEGER},\n      </if>\n      <if test=\"record.identityCard != null\">\n        identity_card = #{record.identityCard,jdbcType=VARCHAR},\n      </if>\n      <if test=\"record.email != null\">\n        email = #{record.email,jdbcType=VARCHAR},\n      </if>\n      <if test=\"record.qq != null\">\n        qq = #{record.qq,jdbcType=INTEGER},\n      </if>\n      <if test=\"record.wechat != null\">\n        wechat = #{record.wechat,jdbcType=VARCHAR},\n      </if>\n      <if test=\"record.weibo != null\">\n        weibo = #{record.weibo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"record.phone != null\">\n        phone = #{record.phone,jdbcType=VARCHAR},\n      </if>\n      <if test=\"record.isDel != null\">\n        is_del = #{record.isDel,jdbcType=VARCHAR},\n      </if>\n      <if test=\"record.createTime != null\">\n        create_time = #{record.createTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"record.updateTime != null\">\n        update_time = #{record.updateTime,jdbcType=TIMESTAMP},\n      </if>\n    </set>\n    <if test=\"_parameter != null\">\n      <include refid=\"Update_By_Example_Where_Clause\" />\n    </if>\n  </update>\n  <update id=\"updateByExample\" parameterType=\"map\">\n    update userinfo\n    set id = #{record.id,jdbcType=INTEGER},\n      user_id = #{record.userId,jdbcType=INTEGER},\n      sex = #{record.sex,jdbcType=VARCHAR},\n      birthday = #{record.birthday,jdbcType=DATE},\n      age = #{record.age,jdbcType=INTEGER},\n      identity_card = #{record.identityCard,jdbcType=VARCHAR},\n      email = #{record.email,jdbcType=VARCHAR},\n      qq = #{record.qq,jdbcType=INTEGER},\n      wechat = #{record.wechat,jdbcType=VARCHAR},\n      weibo = #{record.weibo,jdbcType=VARCHAR},\n      phone = #{record.phone,jdbcType=VARCHAR},\n      is_del = #{record.isDel,jdbcType=VARCHAR},\n      create_time = #{record.createTime,jdbcType=TIMESTAMP},\n      update_time = #{record.updateTime,jdbcType=TIMESTAMP}\n    <if test=\"_parameter != null\">\n      <include refid=\"Update_By_Example_Where_Clause\" />\n    </if>\n  </update>\n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.zmh.projectoa.model.Userinfo\">\n    update userinfo\n    <set>\n      <if test=\"userId != null\">\n        user_id = #{userId,jdbcType=INTEGER},\n      </if>\n      <if test=\"sex != null\">\n        sex = #{sex,jdbcType=VARCHAR},\n      </if>\n      <if test=\"birthday != null\">\n        birthday = #{birthday,jdbcType=DATE},\n      </if>\n      <if test=\"age != null\">\n        age = #{age,jdbcType=INTEGER},\n      </if>\n      <if test=\"identityCard != null\">\n        identity_card = #{identityCard,jdbcType=VARCHAR},\n      </if>\n      <if test=\"email != null\">\n        email = #{email,jdbcType=VARCHAR},\n      </if>\n      <if test=\"qq != null\">\n        qq = #{qq,jdbcType=INTEGER},\n      </if>\n      <if test=\"wechat != null\">\n        wechat = #{wechat,jdbcType=VARCHAR},\n      </if>\n      <if test=\"weibo != null\">\n        weibo = #{weibo,jdbcType=VARCHAR},\n      </if>\n      <if test=\"phone != null\">\n        phone = #{phone,jdbcType=VARCHAR},\n      </if>\n      <if test=\"isDel != null\">\n        is_del = #{isDel,jdbcType=VARCHAR},\n      </if>\n      <if test=\"createTime != null\">\n        create_time = #{createTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"updateTime != null\">\n        update_time = #{updateTime,jdbcType=TIMESTAMP},\n      </if>\n    </set>\n    where id = #{id,jdbcType=INTEGER}\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.zmh.projectoa.model.Userinfo\">\n    update userinfo\n    set user_id = #{userId,jdbcType=INTEGER},\n      sex = #{sex,jdbcType=VARCHAR},\n      birthday = #{birthday,jdbcType=DATE},\n      age = #{age,jdbcType=INTEGER},\n      identity_card = #{identityCard,jdbcType=VARCHAR},\n      email = #{email,jdbcType=VARCHAR},\n      qq = #{qq,jdbcType=INTEGER},\n      wechat = #{wechat,jdbcType=VARCHAR},\n      weibo = #{weibo,jdbcType=VARCHAR},\n      phone = #{phone,jdbcType=VARCHAR},\n      is_del = #{isDel,jdbcType=VARCHAR},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      update_time = #{updateTime,jdbcType=TIMESTAMP}\n    where id = #{id,jdbcType=INTEGER}\n  </update>\n  \n  <select id=\"queryUserinfoByUserid\" resultType=\"com.zmh.projectoa.model.Userinfo\">\n    select * from userinfo where user_id=#{userId}\n  </select>\n</mapper>"
  },
  {
    "path": "src/main/resources/templates/mapper/UsersMapper.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.zmh.projectoa.mapper.UsersMapper\">\n  <resultMap id=\"BaseResultMap\" type=\"com.zmh.projectoa.model.Users\">\n    <id column=\"id\" jdbcType=\"INTEGER\" property=\"id\" />\n    <result column=\"username\" jdbcType=\"VARCHAR\" property=\"username\" />\n    <result column=\"password\" jdbcType=\"VARCHAR\" property=\"password\" />\n    <result column=\"realname\" jdbcType=\"VARCHAR\" property=\"realname\" />\n    <result column=\"department_id\" jdbcType=\"INTEGER\" property=\"departmentId\" />\n    <result column=\"position_id\" jdbcType=\"INTEGER\" property=\"positionId\" />\n    <result column=\"is_del\" jdbcType=\"VARCHAR\" property=\"isDel\" />\n    <result column=\"last_login_time\" jdbcType=\"TIMESTAMP\" property=\"lastLoginTime\" />\n    <result column=\"create_time\" jdbcType=\"TIMESTAMP\" property=\"createTime\" />\n    <result column=\"update_time\" jdbcType=\"TIMESTAMP\" property=\"updateTime\" />\n  </resultMap>\n  <sql id=\"Example_Where_Clause\">\n    <where>\n      <foreach collection=\"oredCriteria\" item=\"criteria\" separator=\"or\">\n        <if test=\"criteria.valid\">\n          <trim prefix=\"(\" prefixOverrides=\"and\" suffix=\")\">\n            <foreach collection=\"criteria.criteria\" item=\"criterion\">\n              <choose>\n                <when test=\"criterion.noValue\">\n                  and ${criterion.condition}\n                </when>\n                <when test=\"criterion.singleValue\">\n                  and ${criterion.condition} #{criterion.value}\n                </when>\n                <when test=\"criterion.betweenValue\">\n                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}\n                </when>\n                <when test=\"criterion.listValue\">\n                  and ${criterion.condition}\n                  <foreach close=\")\" collection=\"criterion.value\" item=\"listItem\" open=\"(\" separator=\",\">\n                    #{listItem}\n                  </foreach>\n                </when>\n              </choose>\n            </foreach>\n          </trim>\n        </if>\n      </foreach>\n    </where>\n  </sql>\n  <sql id=\"Update_By_Example_Where_Clause\">\n    <where>\n      <foreach collection=\"example.oredCriteria\" item=\"criteria\" separator=\"or\">\n        <if test=\"criteria.valid\">\n          <trim prefix=\"(\" prefixOverrides=\"and\" suffix=\")\">\n            <foreach collection=\"criteria.criteria\" item=\"criterion\">\n              <choose>\n                <when test=\"criterion.noValue\">\n                  and ${criterion.condition}\n                </when>\n                <when test=\"criterion.singleValue\">\n                  and ${criterion.condition} #{criterion.value}\n                </when>\n                <when test=\"criterion.betweenValue\">\n                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}\n                </when>\n                <when test=\"criterion.listValue\">\n                  and ${criterion.condition}\n                  <foreach close=\")\" collection=\"criterion.value\" item=\"listItem\" open=\"(\" separator=\",\">\n                    #{listItem}\n                  </foreach>\n                </when>\n              </choose>\n            </foreach>\n          </trim>\n        </if>\n      </foreach>\n    </where>\n  </sql>\n  <sql id=\"Base_Column_List\">\n    id, username, password, realname, department_id, position_id, is_del, last_login_time, \n    create_time, update_time\n  </sql>\n  <select id=\"selectByExample\" parameterType=\"com.zmh.projectoa.model.UsersExample\" resultMap=\"BaseResultMap\">\n    select\n    <if test=\"distinct\">\n      distinct\n    </if>\n    <include refid=\"Base_Column_List\" />\n    from users\n    <if test=\"_parameter != null\">\n      <include refid=\"Example_Where_Clause\" />\n    </if>\n    <if test=\"orderByClause != null\">\n      order by ${orderByClause}\n    </if>\n    <if test=\"limit != null\">\n      <if test=\"offset != null\">\n        limit ${offset}, ${limit}\n      </if>\n      <if test=\"offset == null\">\n        limit ${limit}\n      </if>\n    </if>\n  </select>\n  <select id=\"selectByPrimaryKey\" parameterType=\"java.lang.Integer\" resultMap=\"BaseResultMap\">\n    select \n    <include refid=\"Base_Column_List\" />\n    from users\n    where id = #{id,jdbcType=INTEGER}\n  </select>\n  <delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang.Integer\">\n    delete from users\n    where id = #{id,jdbcType=INTEGER}\n  </delete>\n  <delete id=\"deleteByExample\" parameterType=\"com.zmh.projectoa.model.UsersExample\">\n    delete from users\n    <if test=\"_parameter != null\">\n      <include refid=\"Example_Where_Clause\" />\n    </if>\n  </delete>\n  <insert id=\"insert\" parameterType=\"com.zmh.projectoa.model.Users\">\n    <selectKey keyProperty=\"id\" order=\"AFTER\" resultType=\"java.lang.Integer\">\n      SELECT LAST_INSERT_ID()\n    </selectKey>\n    insert into users (username, password, realname, \n      department_id, position_id, is_del, \n      last_login_time, create_time, update_time\n      )\n    values (#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{realname,jdbcType=VARCHAR}, \n      #{departmentId,jdbcType=INTEGER}, #{positionId,jdbcType=INTEGER}, #{isDel,jdbcType=VARCHAR}, \n      #{lastLoginTime,jdbcType=TIMESTAMP}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP}\n      )\n  </insert>\n  <insert id=\"insertSelective\" parameterType=\"com.zmh.projectoa.model.Users\">\n    <selectKey keyProperty=\"id\" order=\"AFTER\" resultType=\"java.lang.Integer\">\n      SELECT LAST_INSERT_ID()\n    </selectKey>\n    insert into users\n    <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n      <if test=\"username != null\">\n        username,\n      </if>\n      <if test=\"password != null\">\n        password,\n      </if>\n      <if test=\"realname != null\">\n        realname,\n      </if>\n      <if test=\"departmentId != null\">\n        department_id,\n      </if>\n      <if test=\"positionId != null\">\n        position_id,\n      </if>\n      <if test=\"isDel != null\">\n        is_del,\n      </if>\n      <if test=\"lastLoginTime != null\">\n        last_login_time,\n      </if>\n      <if test=\"createTime != null\">\n        create_time,\n      </if>\n      <if test=\"updateTime != null\">\n        update_time,\n      </if>\n    </trim>\n    <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">\n      <if test=\"username != null\">\n        #{username,jdbcType=VARCHAR},\n      </if>\n      <if test=\"password != null\">\n        #{password,jdbcType=VARCHAR},\n      </if>\n      <if test=\"realname != null\">\n        #{realname,jdbcType=VARCHAR},\n      </if>\n      <if test=\"departmentId != null\">\n        #{departmentId,jdbcType=INTEGER},\n      </if>\n      <if test=\"positionId != null\">\n        #{positionId,jdbcType=INTEGER},\n      </if>\n      <if test=\"isDel != null\">\n        #{isDel,jdbcType=VARCHAR},\n      </if>\n      <if test=\"lastLoginTime != null\">\n        #{lastLoginTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"createTime != null\">\n        #{createTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"updateTime != null\">\n        #{updateTime,jdbcType=TIMESTAMP},\n      </if>\n    </trim>\n  </insert>\n  <select id=\"countByExample\" parameterType=\"com.zmh.projectoa.model.UsersExample\" resultType=\"java.lang.Long\">\n    select count(*) from users\n    <if test=\"_parameter != null\">\n      <include refid=\"Example_Where_Clause\" />\n    </if>\n  </select>\n  <update id=\"updateByExampleSelective\" parameterType=\"map\">\n    update users\n    <set>\n      <if test=\"record.id != null\">\n        id = #{record.id,jdbcType=INTEGER},\n      </if>\n      <if test=\"record.username != null\">\n        username = #{record.username,jdbcType=VARCHAR},\n      </if>\n      <if test=\"record.password != null\">\n        password = #{record.password,jdbcType=VARCHAR},\n      </if>\n      <if test=\"record.realname != null\">\n        realname = #{record.realname,jdbcType=VARCHAR},\n      </if>\n      <if test=\"record.departmentId != null\">\n        department_id = #{record.departmentId,jdbcType=INTEGER},\n      </if>\n      <if test=\"record.positionId != null\">\n        position_id = #{record.positionId,jdbcType=INTEGER},\n      </if>\n      <if test=\"record.isDel != null\">\n        is_del = #{record.isDel,jdbcType=VARCHAR},\n      </if>\n      <if test=\"record.lastLoginTime != null\">\n        last_login_time = #{record.lastLoginTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"record.createTime != null\">\n        create_time = #{record.createTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"record.updateTime != null\">\n        update_time = #{record.updateTime,jdbcType=TIMESTAMP},\n      </if>\n    </set>\n    <if test=\"_parameter != null\">\n      <include refid=\"Update_By_Example_Where_Clause\" />\n    </if>\n  </update>\n  <update id=\"updateByExample\" parameterType=\"map\">\n    update users\n    set id = #{record.id,jdbcType=INTEGER},\n      username = #{record.username,jdbcType=VARCHAR},\n      password = #{record.password,jdbcType=VARCHAR},\n      realname = #{record.realname,jdbcType=VARCHAR},\n      department_id = #{record.departmentId,jdbcType=INTEGER},\n      position_id = #{record.positionId,jdbcType=INTEGER},\n      is_del = #{record.isDel,jdbcType=VARCHAR},\n      last_login_time = #{record.lastLoginTime,jdbcType=TIMESTAMP},\n      create_time = #{record.createTime,jdbcType=TIMESTAMP},\n      update_time = #{record.updateTime,jdbcType=TIMESTAMP}\n    <if test=\"_parameter != null\">\n      <include refid=\"Update_By_Example_Where_Clause\" />\n    </if>\n  </update>\n  <update id=\"updateByPrimaryKeySelective\" parameterType=\"com.zmh.projectoa.model.Users\">\n    update users\n    <set>\n      <if test=\"username != null\">\n        username = #{username,jdbcType=VARCHAR},\n      </if>\n      <if test=\"password != null\">\n        password = #{password,jdbcType=VARCHAR},\n      </if>\n      <if test=\"realname != null\">\n        realname = #{realname,jdbcType=VARCHAR},\n      </if>\n      <if test=\"departmentId != null\">\n        department_id = #{departmentId,jdbcType=INTEGER},\n      </if>\n      <if test=\"positionId != null\">\n        position_id = #{positionId,jdbcType=INTEGER},\n      </if>\n      <if test=\"isDel != null\">\n        is_del = #{isDel,jdbcType=VARCHAR},\n      </if>\n      <if test=\"lastLoginTime != null\">\n        last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"createTime != null\">\n        create_time = #{createTime,jdbcType=TIMESTAMP},\n      </if>\n      <if test=\"updateTime != null\">\n        update_time = #{updateTime,jdbcType=TIMESTAMP},\n      </if>\n    </set>\n    where id = #{id,jdbcType=INTEGER}\n  </update>\n  <update id=\"updateByPrimaryKey\" parameterType=\"com.zmh.projectoa.model.Users\">\n    update users\n    set username = #{username,jdbcType=VARCHAR},\n      password = #{password,jdbcType=VARCHAR},\n      realname = #{realname,jdbcType=VARCHAR},\n      department_id = #{departmentId,jdbcType=INTEGER},\n      position_id = #{positionId,jdbcType=INTEGER},\n      is_del = #{isDel,jdbcType=VARCHAR},\n      last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP},\n      create_time = #{createTime,jdbcType=TIMESTAMP},\n      update_time = #{updateTime,jdbcType=TIMESTAMP}\n    where id = #{id,jdbcType=INTEGER}\n  </update>\n  \n  <select id=\"queryUserByUsername\" resultType=\"com.zmh.projectoa.model.Users\">\n    select * from users where username = #{username}\n  </select>\n\n  <select id=\"queryBySelective\" parameterType=\"com.zmh.projectoa.model.Users\" resultType=\"com.zmh.projectoa.model.Users\">\n    select * from users where 1=1\n      <if test=\"username != null\">\n        and username = #{username,jdbcType=VARCHAR}\n      </if>\n      <if test=\"password != null and password !='' \">\n        and password = #{password,jdbcType=VARCHAR}\n      </if>\n      <if test=\"realname != null and realname !='' \">\n        and realname LIKE \"%\"#{realname,jdbcType=VARCHAR}\"%\"\n      </if>\n      <if test=\"departmentId != null and departmentId !='' \">\n        and department_id = #{departmentId,jdbcType=INTEGER}\n      </if>\n      <if test=\"positionId != null and positionId !='' \">\n        and position_id = #{positionId,jdbcType=INTEGER}\n      </if>\n      <if test=\"isDel != null and isDel !='' \">\n        and is_del = #{isDel,jdbcType=VARCHAR}\n      </if>\n      <if test=\"lastLoginTime != null and lastLoginTime !='' \">\n        and last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP}\n      </if>\n      <if test=\"createTime != null and createTime !=''\">\n        and create_time = #{createTime,jdbcType=TIMESTAMP}\n      </if>\n      <if test=\"updateTime != null and updateTime !=''\">\n        and update_time = #{updateTime,jdbcType=TIMESTAMP}\n      </if>\n    order by create_time desc\n  </select>\n\n\n  <select id=\"queryAll\" resultType=\"java.util.Map\" parameterType=\"Integer\">\n    SELECT\n        users.id,\n        users.realname,\n        departments.department\n    FROM\n        users\n    INNER JOIN departments ON departments.id = users.department_id\n    WHERE\n        users.id != #{id}\n    ORDER BY\n        users.department_id\n  </select>\n\n\n    <select id=\"queryAllUsers\" resultMap=\"BaseResultMap\">\n        SELECT\n            id,\n            realname\n        FROM\n            users\n        WHERE\n            is_del != 1\n    </select>\n\n\n</mapper>"
  },
  {
    "path": "src/main/resources/templates/view/403.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>OA系统</title>\n    <meta name=\"description\" content=\"这是一个 index 页面\">\n    <meta name=\"keywords\" content=\"index\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"renderer\" content=\"webkit\">\n    <meta http-equiv=\"Cache-Control\" content=\"no-siteapp\"/>\n    <link rel=\"icon\" type=\"image/png\" href=\"assets/i/favicon.png\">\n    <link rel=\"apple-touch-icon-precomposed\" href=\"assets/i/app-icon72x72@2x.png\">\n    <meta name=\"apple-mobile-web-app-title\" content=\"Amaze UI\"/>\n    <script src=\"assets/js/echarts.min.js\"></script>\n    <link rel=\"stylesheet\" href=\"assets/css/amazeui.min.css\"/>\n    <link rel=\"stylesheet\" href=\"assets/css/amazeui.datatables.min.css\"/>\n    <link rel=\"stylesheet\" href=\"assets/css/app.css\">\n    <script src=\"assets/js/jquery.min.js\"></script>\n\n</head>\n<body data-type=\"widgets\">\n<script src=\"assets/js/theme.js\"></script>\n<!-- 内容区域 -->\n<div class=\"row-content am-cf\">\n    <div class=\"widget am-cf\">\n        <div class=\"widget-body\">\n            <div class=\"tpl-page-state\">\n                <div class=\"tpl-page-state-title am-text-center tpl-error-title\">403</div>\n                <div class=\"tpl-error-title-info\">Access Error</div>\n                <div class=\"tpl-page-state-content tpl-error-content\">\n                    <p>您所在用户的没有权限访问，请与系统管理员联系。</p>\n                    <button type=\"button\" class=\"am-btn am-btn-secondary am-radius tpl-error-btn\"\n                            onclick=\"javascrtpt:window.location.href='/projectoa/index'\">回到首页\n                    </button>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n<script src=\"assets/js/amazeui.min.js\"></script>\n<script src=\"assets/js/amazeui.datatables.min.js\"></script>\n<script src=\"assets/js/dataTables.responsive.min.js\"></script>\n<script src=\"assets/js/app.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "src/main/resources/templates/view/calendar.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"\n      xmlns=\"http://www.w3.org/1999/xhtml\"\n      xmlns:th=\"http://www.thymeleaf.org\"\n      xmlns:layout=\"http://www.ultraq.net.nz/thymeleaf/layout\"\n      layout:decorator=\"common/common\">\n\n<div class=\"centerView\" data-type=\"widgets\" th:fragment=\"content\">\n    <!-- 内容区域 -->\n    <div class=\"tpl-content-wrapper\">\n        <div class=\"row-content am-cf\">\n            <div class=\"tpl-calendar-box\">\n                <div id=\"calendar\"></div>\n            </div>\n        </div>\n    </div>\n    <!-- 弹出层 -->\n    <div class=\"am-modal am-modal-no-btn\" id=\"calendar-edit-box\">\n        <div class=\"am-modal-dialog tpl-model-dialog\">\n            <div class=\"am-modal-hd\">\n                <a href=\"javascript: void(0)\" class=\"am-close edit-box-close am-close-spin\"\n                   data-am-modal-close>&times;</a>\n            </div>\n            <div class=\"am-modal-bd tpl-am-model-bd am-cf\">\n\n                <form class=\"am-form tpl-form-border-form\">\n                    <div class=\"am-form-group am-u-sm-12\">\n                        <label for=\"user-name\" class=\"am-u-sm-12 am-form-label am-text-left\">标题 <span\n                                class=\"tpl-form-line-small-title\">Title</span></label>\n                        <div class=\"am-u-sm-12\">\n                            <input type=\"text\" class=\"tpl-form-input am-margin-top-xs calendar-edit-box-title\"\n                                   id=\"user-name\" placeholder=\"\" disabled>\n                        </div>\n                    </div>\n                </form>\n            </div>\n        </div>\n    </div>\n\n    <script>\n        //这个页面一共也就几句话，就写页面里面了\n        $(document).ready(function () {\n            var calendarData = getCalendarData();\n            if (calendarData == null || calendarData == '') {\n                //初次使用 空的json数组\n                var calendarData = [];\n            }else if(typeof calendarData == 'string'){\n                //类型转换  json string -> json object\n                calendarData = jQuery.parseJSON(calendarData);\n            }\n            var editBox = $('#calendar-edit-box');\n            $('.edit-box-close').on('click', function () {\n                $('#calendar').fullCalendar('unselect');\n            });\n            $('#calendar').fullCalendar({\n                header: {\n                    left: 'prev,next today',\n                    center: 'title',\n                    right: 'month,agendaWeek,agendaDay'\n                },\n                monthNames: [\"一月\", \"二月\", \"三月\", \"四月\", \"五月\", \"六月\", \"七月\", \"八月\", \"九月\", \"十月\", \"十一月\", \"十二月\"],\n                monthNamesShort: [\"一月\", \"二月\", \"三月\", \"四月\", \"五月\", \"六月\", \"七月\", \"八月\", \"九月\", \"十月\", \"十一月\", \"十二月\"],\n                dayNames: [\"星期日\", \"星期一\", \"星期二\", \"星期三\", \"星期四\", \"星期五\", \"星期六\"],\n                dayNamesShort: [\"星期日\", \"星期一\", \"星期二\", \"星期三\", \"星期四\", \"星期五\", \"星期六\"],\n                today: [\"今天\"],\n                firstDay: 1,\n                buttonText: {\n                    today: '本月',\n                    month: '月',\n                    week: '周',\n                    day: '日',\n                    prev: '上一月',\n                    next: '下一月'\n                },\n                lang: 'zh-cn',\n                navLinks: true, // can click day/week names to navigate views\n                selectable: true,\n                selectHelper: true,\n                select: function (start, end) {\n                    //弹出框部分\n                    showPrompt('请输入要记录在日历上的日程','记录日程').modal({\n                        onConfirm: function(e) {\n                            if(e&&e.data){\n                                var title = e.data;\n                                var eventData;\n                                if (title) {\n                                    eventData = {\n                                        title: title,\n                                        start: start,\n                                        end: end\n                                    };\n                                    $('#calendar').fullCalendar('renderEvent', eventData, true); // stick? = true\n                                    //同步到redis ID用最后一个的id+1 第一次用没有最后一个 使用 0\n                                    if(calendarData.length > 0)\n                                        eventData.id = calendarData[calendarData.length - 1].id + 1;\n                                    else\n                                        eventData.id = 0;\n                                    calendarData.push(eventData);\n                                    setCalendarData(JSON.stringify(calendarData));\n                                }\n                                $('#calendar').fullCalendar('unselect');\n                            }\n                        }\n                    });\n                },\n                editable: true,\n                eventLimit: true, // allow \"more\" link when too many events\n                events: calendarData\n            });\n\n        });\n        $('#calendarA').attr('class', 'active');\n\n        function getCalendarData() {\n            var result = \"\";\n            $.ajax({\n                type: \"POST\",\n                url: contextPath + \"/calendarGetValue\",\n                dataType: \"json\",\n                async: false,//同步\n                cache:false,\n                success: function (data) {\n                    if (data.code == 000)\n                        result = data.value;\n                }\n            });\n            return result;\n        }\n\n        function setCalendarData(calendarData) {\n            $.post(contextPath + \"/calendarSetValue\", {'value': calendarData});\n        }\n    </script>\n</div>\n\n</html>"
  },
  {
    "path": "src/main/resources/templates/view/changePassWord.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"\n      xmlns=\"http://www.w3.org/1999/xhtml\"\n      xmlns:th=\"http://www.thymeleaf.org\"\n      xmlns:layout=\"http://www.ultraq.net.nz/thymeleaf/layout\"\n      layout:decorator=\"common/common\">\n\n<div class=\"centerView\" data-type=\"widgets\" th:fragment=\"content\">\n    <!-- 内容区域 -->\n    <div class=\"tpl-content-wrapper\" id=\"user_create\">\n        <div class=\"row-content am-cf\">\n            <div class=\"row\">\n                <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-12\">\n                    <div class=\"widget am-cf\">\n                        <div class=\"widget-head am-cf\">\n                            <div class=\"widget-title am-fl\">修改密码</div>\n                        </div>\n                        <div class=\"widget-body am-fr\">\n\n                            <form class=\"am-form tpl-form-border-form tpl-form-border-br\">\n                                <div class=\"am-form-group\">\n                                    <label for=\"oldpassword\" class=\"am-u-sm-3 am-form-label\">旧密码</label>\n                                    <div class=\"am-u-sm-6\">\n                                        <input type=\"password\" class=\"tpl-form-input\" id=\"oldpassword\" placeholder=\"请输入旧密码\">\n                                        <small>此为当前正在使用的密码</small>\n                                    </div>\n                                </div>\n                                <div class=\"am-form-group\">\n                                    <label for=\"newpassword\" class=\"am-u-sm-3 am-form-label\">新密码</label>\n                                    <div class=\"am-u-sm-6\">\n                                        <input type=\"password\" class=\"tpl-form-input\" id=\"newpassword\" placeholder=\"请输入新密码\">\n                                        <small>此为需要改成的新的密码</small>\n                                    </div>\n                                </div>\n                                <div class=\"am-form-group\">\n                                    <label for=\"repeatpassword\" class=\"am-u-sm-3 am-form-label\">重复一次新密码</label>\n                                    <div class=\"am-u-sm-6\">\n                                        <input type=\"password\" class=\"tpl-form-input\" id=\"repeatpassword\" placeholder=\"请再输入一遍新密码\">\n                                        <small>此为再输入一遍新的密码，防止误操作</small>\n                                    </div>\n                                </div>\n                                <div class=\"am-form-group\">\n                                    <div class=\"am-u-sm-9 am-u-sm-push-3\">\n                                        <button type=\"button\" class=\"am-btn am-btn-primary tpl-btn-bg-color-success \"\n                                               onclick=\"changePassWord()\" >提交\n                                        </button>\n                                        <a href=\"userinfo/userinfo\" type=\"button\"\n                                           class=\"am-btn am-btn-primary tpl-btn-bg-color-success \">返回\n                                        </a>\n                                    </div>\n                                </div>\n                            </form>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n    <script th:src=\"@{/js/common.js}\"></script>\n    <script>\n        $(document).ready(function () {\n            $('#userinfoA').attr('class', 'active');\n        });\n    </script>\n</div>\n\n</html>"
  },
  {
    "path": "src/main/resources/templates/view/common/common.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:th=\"http://www.thymeleaf.org\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>OA系统</title>\n    <meta name=\"description\" content=\"这是一个 index 页面\">\n    <meta name=\"keywords\" content=\"index\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"renderer\" content=\"webkit\">\n    <meta http-equiv=\"Cache-Control\" content=\"no-siteapp\"/>\n    <link rel=\"icon\" type=\"image/png\" th:href=\"@{/assets/i/favicon.png}\">\n    <link rel=\"apple-touch-icon-precomposed\" th:href=\"@{/assets/i/app-icon72x72@2x.png}\">\n    <meta name=\"apple-mobile-web-app-title\" content=\"Amaze UI\"/>\n\n    <link rel=\"stylesheet\" th:href=\"@{/assets/css/amazeui.min.css}\"/>\n    <link rel=\"stylesheet\" th:href=\"@{/assets/css/amazeui.datatables.min.css}\"/>\n    <link rel=\"stylesheet\" th:href=\"@{/assets/css/fullcalendar.min.css}\"/>\n    <link rel=\"stylesheet\" th:href=\"@{/assets/css/fullcalendar.print.css}\" media='print'/>\n    <link rel=\"stylesheet\" th:href=\"@{/assets/css/app.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/assets/css/flipclock.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/assets/css/todomvc.css}\">\n    <link rel=\"stylesheet\" th:href=\"@{/assets/css/calculator.css}\">\n\n    <script th:src=\"@{/assets/js/echarts.min.js}\"></script>\n    <script th:src=\"@{/assets/js/jquery.min.js}\"></script>\n    <script th:src=\"@{/assets/js/vue.js}\"></script>\n    <script th:src=\"@{/assets/js/amazeui.min.js}\"></script>\n\n    <script>var contextPath = \"/projectoa\";var calculatorIsOpen = false;</script>\n</head>\n<body data-type=\"index\">\n<script th:src=\"@{/assets/js/theme.js}\"></script>\n<div class=\"am-g tpl-g\">\n    <!-- 头部 -->\n    <header id=\"header\">\n        <!-- logo -->\n        <div class=\"am-fl tpl-header-logo\">\n            <a href=\"index\"><img th:src=\"@{/assets/img/logo.png}\" alt=\"\"></a>\n        </div>\n        <!-- 右侧内容 -->\n        <div class=\"tpl-header-fluid\">\n            <!-- 侧边切换 -->\n            <div class=\"am-fl tpl-header-switch-button am-icon-list\" id=\"listSwitchButton\">\n            </div>\n            <!-- 天气插件 http://tianqi.2345.com/plugin/setting.htm?style=classicBig2day -->\n            <iframe style=\"margin-top: 15px\" allowtransparency=\"true\" frameborder=\"0\" width=\"200\" height=\"55\"\n                    scrolling=\"no\"\n                    src=\"//tianqi.2345.com/plugin/widget/index.htm?s=3&z=1&t=1&v=0&d=1&bd=0&k=000000&f=0080c0&ltf=009944&htf=cc0000&q=1&e=0&a=1&c=58362&w=200&h=55&align=left\"></iframe>\n            <!-- 其它功能-->\n            <div class=\"am-fr tpl-header-navbar\">\n                <ul>\n                    <!-- 欢迎语 -->\n                    <li class=\"am-text-sm tpl-header-navbar-welcome\">\n                        <a href=\"userinfo/userinfo\">欢迎你, <span shiro:principal property=\"realname\"></span> </a>\n                    </li>\n\n                    <!-- 新邮件 -->\n                    <li class=\"am-dropdown tpl-dropdown\" data-am-dropdown id=\"messageLi\">\n                        <a href=\"javascript:;\" class=\"am-dropdown-toggle tpl-dropdown-toggle\" data-am-dropdown-toggle>\n                            <i class=\"am-icon-envelope\"></i>\n                            <!-- 智能显示消息个数 等于=0则不显示 使用v-cloak可以避免加载中显示出花括号 -->\n                            <span class=\"am-badge am-badge-success am-round item-feed-badge\" id=\"messageUnReadNum\"\n                                  v-if=\"messageList.length != 0\" v-cloak>{{messageList.length}}</span>\n                        </a>\n                        <!-- 弹出列表 -->\n                        <ul class=\"am-dropdown-content tpl-dropdown-content\" style=\"width: 400px\">\n                            <li class=\"tpl-dropdown-menu-messages\" v-if=\"messageList.length == 0\">\n                                <a href=\"javascript:;\" class=\"tpl-dropdown-menu-messages-item am-cf\">\n                                    <div class=\"menu-messages-content\">\n                                        <div class=\"am-text-truncate\">\n                                            <span>暂无新消息</span>\n                                        </div>\n                                    </div>\n                                </a>\n                            </li>\n                            <li class=\"tpl-dropdown-menu-messages\" v-else v-for=\"message in messageList\">\n                                <a :href=\"'/projectoa/message/message_dtl/'+message.id\"\n                                   class=\"tpl-dropdown-menu-messages-item am-cf\">\n                                    <div class=\"menu-messages-content\">\n                                        <span class=\"am-text-truncate\">{{message.realname}}&nbsp;:&nbsp;{{message.title}}</span>\n                                        <span class=\"menu-messages-content-time\" style=\"float:right\">{{message.create_time}}</span>\n                                    </div>\n                                </a>\n                            </li>\n\n                            <li class=\"tpl-dropdown-menu-messages\">\n                                <a href=\"message/message\" class=\"tpl-dropdown-menu-messages-item am-cf\">\n                                    <i class=\"am-icon-circle-o\"></i> 进入列表…\n                                </a>\n                            </li>\n                        </ul>\n                    </li>\n\n                    <!-- 新提示 -->\n                    <li class=\"am-dropdown\" data-am-dropdown>\n                        <a href=\"javascript:;\" class=\"am-dropdown-toggle\" data-am-dropdown-toggle>\n                            <i class=\"am-icon-bell\"></i>\n                            <span class=\"am-badge am-badge-warning am-round item-feed-badge\"\n                                  v-if=\"noticeList.length != 0\" v-cloak\n                                  id=\"noticeUnReadNum\">{{noticeList.length}}</span>\n                        </a>\n\n                        <!-- 弹出列表 -->\n                        <ul class=\"am-dropdown-content tpl-dropdown-content\" style=\"width: 400px\">\n                            <li class=\"tpl-dropdown-menu-messages\" v-if=\"noticeList.length == 0\">\n                                <a href=\"javascript:;\" class=\"tpl-dropdown-menu-messages-item am-cf\">\n                                    <div class=\"menu-messages-content\">\n                                        <div class=\"am-text-truncate\">\n                                            <span>暂无新消息</span>\n                                        </div>\n                                    </div>\n                                </a>\n                            </li>\n                            <li class=\"tpl-dropdown-menu-messages\" v-else v-for=\"notice in noticeList\">\n                                <a :href=\"'/projectoa/notice/notice_dtl/'+notice.id\"\n                                   class=\"tpl-dropdown-menu-messages-item am-cf\">\n                                    <div class=\"menu-messages-content\">\n                                        <span class=\"am-text-truncate\">{{notice.realname}}&nbsp;:&nbsp;{{notice.title}}</span>\n                                        <span class=\"menu-messages-content-time\" style=\"float:right\">{{notice.create_time}}</span>\n                                    </div>\n                                </a>\n                            </li>\n\n                            <li class=\"tpl-dropdown-menu-notifications\">\n                                <a href=\"notice/notice\" class=\"tpl-dropdown-menu-notifications-item am-cf\">\n                                    <i class=\"am-icon-bell\"></i> 进入列表…\n                                </a>\n                            </li>\n                        </ul>\n                    </li>\n\n                    <!-- 主题 -->\n                    <li class=\"am-text-sm\">\n                        <a href=\"javascript:;\" id=\"eyeshield\">\n                            <i class=\"am-icon-toggle-off\" id=\"eyesI\"></i> 护眼\n                        </a>\n                    </li>\n\n                    <!-- 退出 -->\n                    <li class=\"am-text-sm\">\n                        <a href=\"javascript:;\" id=\"exit\">\n                            <span class=\"am-icon-sign-out\"></span> 退出\n                        </a>\n                    </li>\n                </ul>\n            </div>\n        </div>\n\n    </header>\n    <!-- 侧边导航栏 -->\n    <div class=\"left-sidebar\">\n        <!-- 用户信息 -->\n        <div class=\"tpl-sidebar-user-panel\">\n            <div class=\"tpl-user-panel-slide-toggleable\">\n                <div class=\"tpl-user-panel-profile-picture\"\n                     onclick=\"javascript:window.location.href='/projectoa/userinfo/userinfo'\">\n                    <img alt=\"\" id=\"headImageDIV\">\n                </div>\n                <span class=\"user-panel-logged-in-text\">\n              <i class=\"am-icon-circle-o am-text-success tpl-user-panel-status-icon\"></i>\n              <span shiro:principal property=\"realname\"></span>\n          </span>\n                <a href=\"userinfo/changePassWord\" class=\"tpl-user-panel-action-link\"><span class=\"am-icon-pencil\">&nbsp;&nbsp;修改密码</span></a>\n            </div>\n        </div>\n\n\n        <!-- 菜单 -->\n        <ul class=\"sidebar-nav\">\n            <li class=\"sidebar-nav-link\">\n                <a href=\"index\" id=\"indexA\">\n                    <i class=\"am-icon-home sidebar-nav-link-logo\"></i> 首页\n                </a>\n            </li>\n            <shiro:hasRole name=\"user\">\n                <li class=\"sidebar-nav-link\">\n                    <a href=\"user/user\" id=\"userA\">\n                        <i class=\"am-icon-table sidebar-nav-link-logo\"></i> 人员信息\n                    </a>\n                </li>\n            </shiro:hasRole>\n            <li class=\"sidebar-nav-link\">\n                <a href=\"userinfo/userinfo\" id=\"userinfoA\">\n                    <i class=\"am-icon-wpforms sidebar-nav-link-logo\"></i> 个人信息\n                </a>\n            </li>\n            <li class=\"sidebar-nav-link\">\n                <a href=\"calendar\" id=\"calendarA\">\n                    <i class=\"am-icon-calendar sidebar-nav-link-logo\"></i> 日程表\n                </a>\n            </li>\n            <shiro:hasRole name=\"admin\">\n                <li class=\"sidebar-nav-link\">\n                    <a href=\"admin/springbootadmin\" id=\"springbootadminA\">\n                        <i class=\"am-icon-heartbeat sidebar-nav-link-logo\"></i> 系统监控\n                    </a>\n                </li>\n                <li class=\"sidebar-nav-link\">\n                    <a href=\"admin/logs\" id=\"logs\">\n                        <i class=\"am-icon-list-alt sidebar-nav-link-logo\"></i> 系统日志\n                    </a>\n                </li>\n            </shiro:hasRole>\n            <li class=\"sidebar-nav-link\">\n                <a href=\"message/message\" id=\"messageA\">\n                    <i class=\"am-icon-envelope sidebar-nav-link-logo\"></i> 站内信箱\n                </a>\n            </li>\n            <li class=\"sidebar-nav-link\">\n                <a href=\"notice/notice\" id=\"noticeA\">\n                    <i class=\"am-icon-bell sidebar-nav-link-logo\"></i> 通知公告\n                </a>\n            </li>\n\n        </ul>\n    </div>\n    <!-- 内容区域 -->\n    <div class=\"tpl-content-wrapper\">\n        <!-- 引入独立部分 -->\n        <div th:include=\"this :: content\"></div>\n    </div>\n    <!-- alert -->\n    <div class=\"am-modal am-modal-alert\" tabindex=\"-1\" id=\"showAlertID\">\n        <div class=\"am-modal-dialog\">\n            <!-- 标题 -->\n            <div id=\"alertTitle\" class=\"am-modal-hd\"></div>\n            <!-- 内容 -->\n            <div id=\"alertText\" class=\"am-modal-bd\"></div>\n            <div class=\"am-modal-footer\">\n                <span class=\"am-modal-btn\">确定</span>\n            </div>\n        </div>\n    </div>\n    <!-- confirm -->\n    <div class=\"am-modal am-modal-confirm\" tabindex=\"-1\" id=\"showConfirmID\">\n        <div class=\"am-modal-dialog\">\n            <div id=\"confirmTitle\" class=\"am-modal-hd\"></div>\n            <div id=\"confirmText\" class=\"am-modal-bd\"></div>\n            <div class=\"am-modal-footer\">\n                <span id=\"confirmCancel\" class=\"am-modal-btn\" data-am-modal-cancel></span>\n                <span id=\"confirmOK\" class=\"am-modal-btn\" data-am-modal-confirm></span>\n            </div>\n        </div>\n    </div>\n    <!-- prompt -->\n    <div class=\"am-modal am-modal-prompt\" tabindex=\"-1\" id=\"showPromptID\">\n        <div class=\"am-modal-dialog\">\n            <div class=\"am-modal-hd\" id=\"promptTitle\"></div>\n            <div class=\"am-modal-bd\">\n                <span id=\"promptText\"></span>\n                <input type=\"text\" class=\"am-modal-prompt-input\">\n            </div>\n            <div class=\"am-modal-footer\">\n                <span id=\"promptCancel\" class=\"am-modal-btn\" data-am-modal-cancel></span>\n                <span id=\"promptOK\" class=\"am-modal-btn\" data-am-modal-confirm></span>\n            </div>\n        </div>\n    </div>\n    <!-- 选择图片 -->\n    <div class=\"am-modal am-modal-no-btn\" tabindex=\"-1\" id=\"changeImageModal\">\n        <div class=\"am-modal-dialog\">\n            <div class=\"am-modal-hd\">\n                <a href=\"javascript: void(0)\" class=\"am-close am-close-spin\" data-am-modal-close>&times;</a>\n            </div>\n            <div class=\"am-modal-bd\">\n                <table>\n                    <tr>\n                        <th style=\"padding: 3px\" onclick=\"changeImage(1)\"><img th:src=\"@{/assets/img/01.jpg}\"\n                                                                               style=\"width: 120px;cursor:pointer\"></th>\n                        <th style=\"padding: 3px\" onclick=\"changeImage(2)\"><img th:src=\"@{/assets/img/02.jpg}\"\n                                                                               style=\"width: 120px;cursor:pointer\"></th>\n                        <th style=\"padding: 3px\" onclick=\"changeImage(3)\"><img th:src=\"@{/assets/img/03.jpg}\"\n                                                                               style=\"width: 120px;cursor:pointer\"></th>\n                    </tr>\n                    <tr>\n                        <th style=\"padding: 3px\" onclick=\"changeImage(4)\"><img th:src=\"@{/assets/img/04.jpg}\"\n                                                                               style=\"width: 120px;cursor:pointer\"></th>\n                        <th style=\"padding: 3px\" onclick=\"changeImage(5)\"><img th:src=\"@{/assets/img/05.jpg}\"\n                                                                               style=\"width: 120px;cursor:pointer\"></th>\n                        <th style=\"padding: 3px\" onclick=\"changeImage(6)\"><img th:src=\"@{/assets/img/06.jpg}\"\n                                                                               style=\"width: 120px;cursor:pointer\"></th>\n                    </tr>\n                    <tr>\n                        <th style=\"padding: 3px\" onclick=\"changeImage(7)\"><img th:src=\"@{/assets/img/07.jpg}\"\n                                                                               style=\"width: 120px;cursor:pointer\"></th>\n                        <th style=\"padding: 3px\" onclick=\"changeImage(8)\"><img th:src=\"@{/assets/img/08.jpg}\"\n                                                                               style=\"width: 120px;cursor:pointer\"></th>\n                        <th style=\"padding: 3px\" onclick=\"changeImage(9)\"><img th:src=\"@{/assets/img/09.jpg}\"\n                                                                               style=\"width: 120px;cursor:pointer\"></th>\n                    </tr>\n                </table>\n                <input type=\"text\" id=\"hidden\" style=\"display: none\">\n            </div>\n        </div>\n    </div>\n    <div class=\"am-modal am-modal-no-btn\" tabindex=\"-1\" id=\"weatherModal\">\n        <div class=\"am-modal-dialog\">\n            <div class=\"am-modal-hd\">\n                <a href=\"javascript: void(0)\" class=\"am-close am-close-spin\" data-am-modal-close>&times;</a>\n                一周天气情况\n            </div>\n            <div class=\"am-modal-bd\">\n                <iframe allowtransparency=\"true\" frameborder=\"0\" width=\"875\" height=\"98\" scrolling=\"no\" src=\"//tianqi.2345.com/plugin/widget/index.htm?s=1&z=1&t=1&v=0&d=5&bd=0&k=000000&f=000080&ltf=009944&htf=cc0000&q=1&e=1&a=1&c=58362&w=875&h=98&align=center\"></iframe>\n            </div>\n        </div>\n    </div>\n    <div class=\"am-modal am-modal-no-btn\" tabindex=\"-1\" id=\"calculatorModal\">\n        <div class=\"am-modal-dialog\">\n            <div class=\"am-modal-hd\" style=\"text-align: center\">\n                <a href=\"javascript: void(0)\" class=\"am-close am-close-spin\" data-am-modal-close>&times;</a>\n                简易计算器\n            </div>\n            <div class=\"am-modal-bd\">\n                <br/>\n                <div id=\"calcuator\">\n                    <input type=\"text\" id=\"input-box\" value=\"0\" size=\"21\" maxlength=\"21\" readonly=\"readonly\"/>\n                    <div id=\"btn-list\">\n                        <div onclick=\"operator('clear')\" class=\" btn-30 btn-radius color-red clear-marginleft\">C</div>\n                        <div onclick=\"operator('opposite')\" class=\" btn-30 btn-radius color-blue\">+/-</div>\n                        <div onclick=\"operator('percent')\" class=\" btn-30 btn-radius color-blue\">%</div>\n                        <div onclick=\"operator('backspace')\" class=\" btn-70 btn-radius color-red font-14\">←</div>\n                        <div onclick=\"typetoinput('7')\" class=\" btn-30 btn-radius clear-marginleft\">7</div>\n                        <div onclick=\"typetoinput('8')\" class=\" btn-30 btn-radius\">8</div>\n                        <div onclick=\"typetoinput('9')\" class=\" btn-30 btn-radius\">9</div>\n                        <div onclick=\"operator('plus')\" class=\" btn-30 btn-radius color-blue font-14\">+</div>\n                        <div onclick=\"operator('minus')\" class=\" btn-30 btn-radius color-blue font-14\">-</div>\n                        <div onclick=\"typetoinput('4')\" class=\" btn-30 btn-radius clear-marginleft\">4</div>\n                        <div onclick=\"typetoinput('5')\" class=\" btn-30 btn-radius\">5</div>\n                        <div onclick=\"typetoinput('6')\" class=\" btn-30 btn-radius\">6</div>\n                        <div onclick=\"operator('multiply')\" class=\" btn-30 btn-radius color-blue font-14\">×</div>\n                        <div onclick=\"operator('divide')\" class=\" btn-30 btn-radius color-blue font-12\">÷</div>\n                        <div onclick=\"typetoinput('1')\" class=\" btn-30 btn-radius clear-marginleft\">1</div>\n                        <div onclick=\"typetoinput('2')\" class=\" btn-30 btn-radius\">2</div>\n                        <div onclick=\"typetoinput('3')\" class=\" btn-30 btn-radius\">3</div>\n                        <div onclick=\"operator('pow')\" class=\" btn-30 btn-radius color-blue font-14\">×²</div>\n                        <div onclick=\"operator('sqrt')\" class=\" btn-30 btn-radius color-blue font-12\">√</div>\n                        <div onclick=\"typetoinput('0')\" class=\" btn-70 btn-radius clear-marginleft\">0</div>\n                        <div onclick=\"typetoinput('.')\" class=\" btn-30 btn-radius\">.</div>\n                        <div onclick=\"operator('result')\" class=\" btn-70 btn-radius color-red font-14\">=</div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n    <!-- 备忘录 -->\n    <div class=\"am-modal am-modal-no-btn\" tabindex=\"-1\" id=\"todomvcModal\">\n        <div class=\"am-modal-dialog\">\n            <div class=\"am-modal-hd\">\n                <a href=\"javascript: void(0)\" class=\"am-close am-close-spin\" data-am-modal-close>&times;</a>\n            </div>\n            <div class=\"am-modal-bd\">\n                <div id=\"todomvc\">\n                    <section class=\"todoapp\">\n                        <header class=\"header\">\n                            <h1 style=\"margin-top: 60px\">备忘录</h1>\n                            <input class=\"new-todo\"\n                                   autofocus autocomplete=\"off\"\n                                   placeholder=\"想要记录一件什么事?\"\n                                   v-model=\"newTodo\"\n                                   @keyup.enter=\"addTodo\">\n                        </header>\n                        <section class=\"main\" v-show=\"todos.length\" v-cloak>\n                            <input class=\"toggle-all\" type=\"checkbox\" v-model=\"allDone\">\n                            <ul class=\"todo-list\">\n                                <li v-for=\"todo in filteredTodos\"\n                                    class=\"todo\"\n                                    :key=\"todo.id\"\n                                    :class=\"{ completed: todo.completed, editing: todo == editedTodo }\">\n                                    <div class=\"view\">\n                                        <input class=\"toggle\" type=\"checkbox\" v-model=\"todo.completed\"\n                                               style=\"left: 5px;\">\n                                        <label @dblclick=\"editTodo(todo)\">{{ todo.title }}</label>\n                                        <button class=\"destroy\" @click=\"removeTodo(todo)\"></button>\n                                    </div>\n                                    <input class=\"edit\" type=\"text\"\n                                           v-model=\"todo.title\"\n                                           v-todo-focus=\"todo == editedTodo\"\n                                           @blur=\"doneEdit(todo)\"\n                                           @keyup.enter=\"doneEdit(todo)\"\n                                           @keyup.esc=\"cancelEdit(todo)\">\n                                </li>\n                            </ul>\n                        </section>\n                        <footer class=\"footer\" v-show=\"todos.length\" v-cloak>\n                            <!--<span class=\"todo-count\">-->\n                              <!--<strong>{{ remaining }}</strong> {{ remaining | pluralize }} 剩余的事-->\n                            <!--</span>-->\n                            <!--<ul class=\"filters\" style=\"bottom: 0px;\" >-->\n                                <!--<li><a href=\"#/all\" :class=\"{ selected: visibility == 'all' }\">全部</a></li>-->\n                                <!--<li><a href=\"#/active\" :class=\"{ selected: visibility == 'active' }\">进行中</a></li>-->\n                                <!--<li><a href=\"#/completed\" :class=\"{ selected: visibility == 'completed' }\">已完成</a>-->\n                                <!--</li>-->\n                            <!--</ul>-->\n                            <button class=\"clear-completed\" style=\"bottom: 10px;\" @click=\"removeCompleted\" v-show=\"todos.length > remaining\">\n                                清除所有已完成的\n                            </button>\n                        </footer>\n                    </section>\n                    <footer class=\"info\">\n                        <p>双击一行可以编辑</p>\n                    </footer>\n                    <div>\n\n\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <script th:src=\"@{/assets/js/amazeui.datatables.min.js}\"></script>\n    <script th:src=\"@{/assets/js/dataTables.responsive.min.js}\"></script>\n    <script th:src=\"@{/assets/js/app.js}\"></script>\n    <script th:src=\"@{/assets/js/moment.js}\"></script>\n    <script th:src=\"@{/assets/js/fullcalendar.min.js}\"></script>\n    <script th:src=\"@{/assets/js/flipclock.min.js}\"></script>\n    <script th:src=\"@{/js/common.js}\"></script>\n    <script th:src=\"@{/assets/js/todomvc.js}\"></script>\n    <script th:src=\"@{/assets/js/calculator.js}\"></script>\n    <script>\n        $(document).ready(function () {\n            //获取护眼模式开关状态\n            getThemeToggle();\n            // 护眼模式\n            $('#eyeshield').on('click', function () {\n                changeTheme();\n            })\n            // 退出按钮\n            $('#exit').on('click', function () {\n                exit();\n            })\n            // 左边栏的隐藏按钮\n            $('#listSwitchButton').on('click', function () {\n                leftSidebar();\n            });\n            //所有a标签纠正\n            $('a').each(function () {\n                if ($(this).attr('href') && $(this).attr('href').indexOf('javascript') < 0\n                    && $(this).attr('href') && $(this).attr('href').indexOf('projectoa') < 0\n                    && $(this).attr('href') != '#')\n\n                    $(this).attr('href', contextPath + \"/\" + $(this).attr('href'));\n            });\n\n            //计算器的JS会监听键盘时间 导致其他组件无法使用退格 故使用以下特殊处理解决\n            $('#calculatorModal').on('open.modal.amui', function(){\n                calculatorIsOpen = true;\n            });\n            $('#calculatorModal').on('close.modal.amui', function(){\n                calculatorIsOpen = false;\n            });\n        });\n    </script>\n</body>\n</html>"
  },
  {
    "path": "src/main/resources/templates/view/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"\n      xmlns=\"http://www.w3.org/1999/xhtml\"\n      xmlns:th=\"http://www.thymeleaf.org\"\n      xmlns:layout=\"http://www.ultraq.net.nz/thymeleaf/layout\"\n      layout:decorator=\"common/common\">\n\n<div class=\"centerView\" data-type=\"index\" th:fragment=\"content\">\n<!-- 内容区域 -->\n<div class=\"tpl-content-wrapper\">\n    <div class=\"row-content am-cf\">\n        <div class=\"row am-cf\">\n            <div class=\"am-u-sm-12 am-u-md-8\">\n                <div class=\"widget am-cf am-text-center\">\n                    <div class=\"widget-head am-cf\">\n                        <div class=\"widget-title am-fl\">\n                            <span id=\"today\"></span>\n                        </div>\n                    </div>\n                    <div class=\"widget-body-md widget-body am-fr\">\n                        <div class=\"clock\" style=\"margin:2em;\"></div>\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"am-u-sm-12 am-u-md-4\">\n                <div class=\"widget am-cf am-text-center\">\n                    <div class=\"widget-head am-cf\">\n                        <div class=\"widget-title am-fl\">工具箱</div>\n                    </div>\n                    <div class=\"widget-body widget-body-md am-fr\">\n                        <table style=\"width: 100%;height: 100%;text-align: center;\">\n                            <tr>\n                                <th>\n                                    <div style=\"cursor:pointer\" data-am-modal=\"{target: '#calculatorModal', closeViaDimmer: 0, width: 300, height: 360}\">\n                                        <img th:src=\"@{/assets/icon/calculator.png}\" style=\"width: 60px\">\n                                    </div>\n                                    <small>计算器</small>\n                                </th>\n                                <th>\n                                    <div style=\"cursor:pointer\" data-am-modal=\"{target: '#weatherModal', closeViaDimmer: 0, width: 900, height: 225}\">\n                                        <img th:src=\"@{/assets/icon/weather.png}\" style=\"width: 60px\">\n                                    </div>\n                                    <small>天气</small>\n                                </th>\n                                <th>\n                                    <div style=\"cursor:pointer\" data-am-modal=\"{target: '#todomvcModal', closeViaDimmer: 0, width: 800, height: 600}\">\n                                        <img th:src=\"@{/assets/icon/notepad.png}\" style=\"width: 60px\">\n                                    </div>\n                                    <small>备忘录</small>\n                                </th>\n                            </tr>\n                            <tr>\n                                <th></th>\n                                <th></th>\n                                <th></th>\n                            </tr>\n                        </table>\n                    </div>\n                </div>\n            </div>\n        </div>\n\n\n        <div class=\"row am-cf\">\n            <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-4 widget-margin-bottom-lg \">\n                <div class=\"tpl-user-card am-text-center widget-body-lg\">\n                    <div class=\"tpl-user-card-title\">\n                        月度最佳员工\n                    </div>\n                    <img class=\"achievement-image\" src=\"\" alt=\"\" id=\"bestImg\">\n                    <div class=\"achievement-subheading\" id=\"bestName\">\n\n                    </div>\n                    <div class=\"achievement-description\">\n                        再接再厉，勇创新高！\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-4 widget-margin-bottom-lg\">\n                <div class=\"widget am-cf widget-body-lg\">\n                    <div class=\"widget-body  am-fr\">\n                        <div class=\"am-scrollable-horizontal \">\n                            <div class=\"widget-head am-cf\">\n                                <div class=\"widget-title am-fl\">站内信</div>\n                            </div>\n                            <div class=\"widget-body widget-body-md am-fr\">\n                                <p id=\"messageP\">暂无最新信息</p>\n                                <span id=\"MessageRealnameS\" style=\"float: right\"></span><br/>\n                                <span id=\"MessageSendTimeS\" style=\"float: right\"></span>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-4 widget-margin-bottom-lg\">\n                <div class=\"widget am-cf widget-body-lg\">\n                    <div class=\"widget-body  am-fr\">\n                        <div class=\"am-scrollable-horizontal \">\n                            <div class=\"widget-head am-cf\">\n                                <div class=\"widget-title am-fl\">公告板</div>\n                            </div>\n                            <div class=\"widget-body widget-body-md am-fr\">\n                                <p id=\"noticeP\">暂无最新信息</p>\n                                <span id=\"NoticeRealnameS\" style=\"float: right\"></span><br/>\n                                <span id=\"NoticeSendTimeS\" style=\"float: right\"></span>\n\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n<script th:src=\"@{/js/index.js}\"></script>\n<script>\n    $(document).ready(function() {\n        $('#indexA').attr('class','active');\n        //翻页钟插件初始化\n        var clock = $('.clock').FlipClock({\n            clockFace: 'TwentyFourHourClock'\n        });\n        $(\"#today\").text(getCurrentDateTime() + \" 农历 \" + showCal());\n        //最佳员工\n        getBestImageNum();\n        getBestUserName();\n        //最后一条信息和公告\n        getLastMessage();\n        getLastNotice();\n    });\n</script>\n</div>\n\n</html>"
  },
  {
    "path": "src/main/resources/templates/view/login.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <title>OA系统</title>\n    <meta name=\"description\" content=\"这是一个 index 页面\">\n    <meta name=\"keywords\" content=\"index\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"renderer\" content=\"webkit\">\n    <meta http-equiv=\"Cache-Control\" content=\"no-siteapp\"/>\n    <link rel=\"icon\" type=\"image/png\" href=\"assets/i/favicon.png\">\n    <link rel=\"apple-touch-icon-precomposed\" href=\"assets/i/app-icon72x72@2x.png\">\n    <meta name=\"apple-mobile-web-app-title\" content=\"Amaze UI\"/>\n    <link rel=\"stylesheet\" href=\"assets/css/amazeui.min.css\"/>\n    <link rel=\"stylesheet\" href=\"assets/css/amazeui.datatables.min.css\"/>\n    <link rel=\"stylesheet\" href=\"assets/css/app.css\">\n    <script src=\"assets/js/jquery.min.js\"></script>\n</head>\n\n<body data-type=\"login\">\n<script src=\"assets/js/theme.js\"></script>\n<div class=\"am-g tpl-g\">\n    <div class=\"tpl-login\">\n        <div class=\"tpl-login-content\">\n                <div class=\"tpl-login-logo\">\n            </div>\n            <form class=\"am-form tpl-form-line-form\" action=\"login/check\">\n                <div class=\"am-form-group\">\n                    <input type=\"text\" class=\"tpl-form-input\" name=\"username\" id=\"username\" placeholder=\"请输入账号\">\n                </div>\n                <div class=\"am-form-group\">\n                    <input type=\"password\" class=\"tpl-form-input\" name=\"password\" id=\"password\" placeholder=\"请输入密码\">\n                </div>\n                <!--<div class=\"am-form-group tpl-login-remember-me\">-->\n                    <!--<input id=\"remember-me\" type=\"checkbox\">-->\n                    <!--<label for=\"remember-me\">-->\n                        <!--记住密码-->\n                    <!--</label>-->\n                <!--</div>-->\n                <div class=\"am-form-group\">\n                    <button type=\"submit\"\n                            class=\"am-btn am-btn-primary  am-btn-block tpl-btn-bg-color-success  tpl-login-btn\">\n                        提交\n                    </button>\n                </div>\n            </form>\n        </div>\n    </div>\n</div>\n<!-- alert -->\n<div class=\"am-modal am-modal-alert\" tabindex=\"-1\" id=\"showAlertID\">\n    <div class=\"am-modal-dialog\">\n        <!-- 标题 -->\n        <div id=\"alertTitle\" class=\"am-modal-hd\">欢迎你</div>\n        <!-- 内容 -->\n        <div id=\"alertText\" class=\"am-modal-bd\">\n            欢迎来的我的线上环境预览OA项目 建议使用管理员账户预览<br/>账号:admin<br/>密码:123456\n        </div>\n        <div class=\"am-modal-footer\">\n            <span class=\"am-modal-btn\">确定</span>\n        </div>\n    </div>\n</div>\n<script src=\"assets/js/amazeui.min.js\"></script>\n<script src=\"assets/js/app.js\"></script>\n<script>\n    $(document).ready(function () {\n        //获取护眼模式开关状态\n        getThemeToggle();\n        $(\"#showAlertID\").modal();\n    });\n</script>\n</body>\n\n</html>"
  },
  {
    "path": "src/main/resources/templates/view/logs.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"\n      xmlns=\"http://www.w3.org/1999/xhtml\"\n      xmlns:th=\"http://www.thymeleaf.org\"\n      xmlns:layout=\"http://www.ultraq.net.nz/thymeleaf/layout\"\n      layout:decorator=\"common/common\">\n\n<div class=\"centerView\" data-type=\"index\" th:fragment=\"content\">\n    <!-- 非常轻量级的代码高亮插件 用来增强pre的功能 由于本次只用在log显示上，所以单独放在这 而不放公共区域 -->\n    <link rel=\"stylesheet\" th:href=\"@{/prism/prism.css(path=${contextPath})}\"/>\n    <script th:src=\"@{/prism/prism.js(path=${contextPath})}\"></script>\n    <!-- 内容区域 -->\n    <div class=\"tpl-content-wrapper\" id=\"log\">\n        <div class=\"row-content am-cf\">\n            <div class=\"row\">\n                <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-12\">\n                    <div class=\"widget am-cf\">\n                        <div class=\"widget-head am-cf\">\n                            <div class=\"widget-title  am-cf\">系统日志</div>\n                        </div>\n                        <div class=\"am-g error-log\">\n                            <div class=\"am-u-sm-12 am-u-sm-centered\" style=\"margin: 10px\">\n                                <select data-am-selected=\"{searchBox: 1,btnWidth: '300px'}\" style=\"display: none;\" id=\"fileName\">\n                                    <option v-for=\"fileName in fileNames\" v-bind:value=\"fileName\">\n                                        {{ fileName }}\n                                    </option>\n                                </select>\n                                <!--<pre class=\"am-pre-scrollable\" ><code id=\"logPre\" class=\"line-numbers,language-java\">加载中，请稍后。</code></pre>-->\n                                <pre class=\"am-pre-scrollable line-numbers\"><code class=\"language-Java\" id=\"logPre\"></code></pre>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n    <script th:src=\"@{/js/logs.js}\"></script>\n    <script>\n        $(document).ready(function () {\n            $('#logs').attr('class', 'active');\n            //自适应pre部分\n            reSizePre();\n            //加载log\n            $('#fileName').on('change', function() {\n                readFiles();\n            });\n            readFiles();\n        });\n    </script>\n</div>\n</html>"
  },
  {
    "path": "src/main/resources/templates/view/message.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"\n      xmlns=\"http://www.w3.org/1999/xhtml\"\n      xmlns:th=\"http://www.thymeleaf.org\"\n      xmlns:layout=\"http://www.ultraq.net.nz/thymeleaf/layout\"\n      layout:decorator=\"common/common\">\n\n<div class=\"centerView\" data-type=\"widgets\" th:fragment=\"content\">\n    <!-- 内容区域 -->\n    <div class=\"tpl-content-wrapper\" id=\"message\">\n        <!-- 选项卡 -->\n        <div class=\"am-tabs\" id=\"messagesTabs\">\n            <ul class=\"am-tabs-nav am-nav am-nav-tabs\">\n                <li><a href=\"\">发送站内信</a></li>\n                <!-- 默认使用收件箱标签 -->\n                <li class=\"am-active\"><a href=\"\">收到的站内信</a></li>\n            </ul>\n            <div class=\"am-tabs-bd\">\n                <div class=\"am-tab-panel\">\n                    <div class=\"row-content am-cf\">\n                        <div class=\"row\">\n                            <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-12\">\n                                <div class=\"widget am-cf\" id=\"sendBackTable\">\n                                    <div class=\"widget-head am-cf\">\n                                        <div class=\"widget-title am-fl\">发送站内信</div>\n                                    </div>\n                                    <div class=\"widget-body am-fr\">\n                                        <form class=\"am-form tpl-form-border-form tpl-form-border-br\">\n                                            <div class=\"am-form-group\">\n                                                <label for=\"receives\" class=\"am-u-sm-3 am-form-label\">收件人</label>\n                                                <div class=\"am-u-sm-6\">\n                                                    <select id=\"receives\" placeholder=\"请选择你要发给谁，可以多选\" multiple\n                                                            data-am-selected style=\"width: 100%\"></select>\n                                                </div>\n                                            </div>\n                                            <div class=\"am-form-group\">\n                                                <label for=\"messageTitle\" class=\"am-u-sm-3 am-form-label\">标题</label>\n                                                <div class=\"am-u-sm-6\">\n                                                    <input type=\"text\" class=\"tpl-form-input\" id=\"messageTitle\"\n                                                           placeholder=\"请输入标题文字\">\n                                                </div>\n                                            </div>\n                                            <div class=\"am-form-group\">\n                                                <label for=\"messageMain\" class=\"am-u-sm-3 am-form-label\">站内信内容</label>\n                                                <div class=\"am-u-sm-6\">\n                                                    <textarea class=\"\" rows=\"10\" id=\"messageMain\"\n                                                              placeholder=\"请输入要发送的内容\"></textarea>\n                                                </div>\n                                            </div>\n                                            <div class=\"am-form-group\">\n                                                <div class=\"am-u-sm-9 am-u-sm-push-3\">\n                                                    <button type=\"button\" onclick=\"sendMessage()\"\n                                                            class=\"am-btn am-btn-primary tpl-btn-bg-color-success \">提交\n                                                    </button>\n                                                </div>\n                                            </div>\n                                        </form>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n                <div class=\"am-tab-panel am-active\">\n                    <div class=\"row-content am-cf\">\n                        <div class=\"row\">\n                            <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-12\">\n                                <div class=\"widget am-cf\">\n                                    <div class=\"widget-head am-cf\">\n                                        <div class=\"widget-title  am-cf\">收到的站内信</div>\n                                    </div>\n                                    <div class=\"widget-body  am-fr\">\n                                        <div class=\"am-u-sm-12\">\n                                            <table width=\"100%\"\n                                                   class=\"am-table am-table-compact am-table-striped tpl-table-black \"\n                                                   id=\"example-r\">\n                                                <thead>\n                                                <tr>\n                                                    <th style=\"text-align: left\">信件标题</th>\n                                                    <th style=\"text-align: left\">发送者</th>\n                                                    <th style=\"text-align: left\">时间</th>\n                                                    <th style=\"text-align: left\">操作</th>\n                                                </tr>\n                                                </thead>\n                                                <tbody v-if=\"messages.length == 0\">\n                                                    <tr>\n                                                        <td colspan=\"6\" align=\"center\">暂无数据</td>\n                                                    </tr>\n                                                </tbody>\n                                                <tbody v-else>\n                                                <tr class=\"gradeX\" v-for=\"message in messages\">\n                                                    <td>{{message.title}}</td>\n                                                    <td>{{message.realname}}</td>\n                                                    <td>{{message.create_time}}</td>\n                                                    <td>\n                                                        <div class=\"tpl-table-black-operation\">\n                                                            <a :href=\"'/projectoa/message/message_dtl/' + message.id\">\n                                                                <i class=\"am-icon-search\"></i> 查看\n                                                            </a>\n                                                        </div>\n                                                    </td>\n                                                </tr>\n\n                                                </tbody>\n                                            </table>\n                                        </div>\n                                        <div class=\"am-u-lg-12 am-cf\" v-if=\"pageInfo.pages != 1\">\n\n                                            <div class=\"am-fr\">\n                                                <ul class=\"am-pagination tpl-pagination\">\n\n                                                    <li><a v-on:click=\"getMessages(1)\" >首页</a></li>\n\n                                                    <li >\n                                                        <a v-on:click=\"getMessages(pageInfo.prePage)\" v-if=\"!pageInfo.isFirstPage\">«</a>\n                                                        <a v-else>«</a>\n                                                    </li>\n\n                                                    <!--<li class=\"am-active\"><a href=\"#\">1</a></li>-->\n                                                    <li v-for=\"n in pageInfo.pages\" v-if=\"pageNum != n\"><a v-on:click=\"getMessages(n)\">{{n}}</a></li>\n                                                    <li class=\"am-active\" v-else><a v-on:click=\"getMessages(n)\">{{n}}</a></li>\n\n                                                    <li >\n                                                        <a v-on:click=\"getMessages(pageInfo.nextPage)\" v-if=\"!pageInfo.isLastPage\">»</a>\n                                                        <a v-else>»</a>\n                                                    </li>\n\n                                                    <li><a v-on:click=\"getMessages(pageInfo.pages)\" >尾页</a></li>\n                                                </ul>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n    <script th:src=\"@{/js/message.js}\"></script>\n    <script>\n        $(document).ready(function () {\n            $('#messageA').attr('class', 'active');\n            $('#messagesTabs').tabs();\n            // 设置参数\n            $('#receives').selected({\n                btnSize: 'sm',\n                btnStyle: 'default',\n                btnWidth: '100%',\n                maxHeight: '350px',\n                searchBox: 1\n            });\n            $('#sendBackTable').css('height',$('#sendBackTable').css('width').replace('px','') / 1.8 );\n        });\n    </script>\n</div>\n\n</html>"
  },
  {
    "path": "src/main/resources/templates/view/message_dtl.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"\n      xmlns=\"http://www.w3.org/1999/xhtml\"\n      xmlns:th=\"http://www.thymeleaf.org\"\n      xmlns:layout=\"http://www.ultraq.net.nz/thymeleaf/layout\"\n      layout:decorator=\"common/common\">\n\n<div class=\"centerView\" data-type=\"widgets\" th:fragment=\"content\">\n    <!-- 内容区域 -->\n    <div class=\"tpl-content-wrapper\" id=\"messsage_dtl\">\n        <div class=\"row-content am-cf\">\n            <div class=\"row\">\n                <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-12\">\n                    <div class=\"widget am-cf\">\n                        <div class=\"row\">\n                            <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-12\">\n                                <div class=\"widget am-cf\">\n                                    <div class=\"widget-body\">\n                                        <div class=\"tpl-page-state\">\n                                            <div class=\"tpl-page-state-title am-text-center\">\n                                                <span id=\"message_dtl_title\"></span>\n                                            </div>\n                                            <div class=\"tpl-page-state-content\">\n                                                <p id=\"message_dtl_main\"></p>\n                                            </div>\n                                            <div class=\"tpl-page-state-content\">\n                                                <span style=\"float: right\" id=\"sendUserName\"></span>\n                                                <br/>\n                                                <span style=\"float: right\" id=\"sendTime\"></span>\n                                                <br>\n                                                <a type=\"button\" style=\"width:100px;margin: 0 auto;display:block;\"\n                                                   class=\"am-btn am-btn-primary tpl-btn-bg-color-success am-text-center\"\n                                                   href=\"message/message\"\n                                                >返回</a>\n                                            </div>\n                                        </div>\n\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <script th:src=\"@{/js/message_dtl.js}\"></script>\n        <script>\n            $(document).ready(function () {\n                $('#messageA').attr('class', 'active');\n                getMessageDtl();\n            });\n        </script>\n    </div>\n</html>"
  },
  {
    "path": "src/main/resources/templates/view/notice.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"\n      xmlns=\"http://www.w3.org/1999/xhtml\"\n      xmlns:th=\"http://www.thymeleaf.org\"\n      xmlns:layout=\"http://www.ultraq.net.nz/thymeleaf/layout\"\n      layout:decorator=\"common/common\">\n\n<div class=\"centerView\" data-type=\"widgets\" th:fragment=\"content\">\n    <!-- 内容区域 -->\n    <div class=\"tpl-content-wrapper\" id=\"notice\">\n        <div class=\"row-content am-cf\">\n            <div class=\"row\">\n                <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-12\">\n                    <div class=\"widget am-cf\">\n                        <div class=\"widget-head am-cf\">\n                            <div class=\"widget-title  am-cf\">公告板</div>\n                        </div>\n                        <div class=\"widget-body  am-fr\">\n                            <shiro:hasPermission name=\"notice\">\n                            <div class=\"am-u-sm-12 am-u-md-6 am-u-lg-6\">\n                                <div class=\"am-form-group\">\n                                    <div class=\"am-btn-toolbar\">\n                                        <div class=\"am-btn-group am-btn-group-xs\">\n                                            <button type=\"button\" class=\"am-btn am-btn-default am-btn-success\"\n                                                    onclick=\"javascrtpt:window.location.href='notice_create'\">>\n                                                <span class=\"am-icon-plus\"></span> 新增\n                                            </button>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                            </shiro:hasPermission>\n                            <div class=\"am-u-sm-12\">\n                                <table width=\"100%\" class=\"am-table am-table-compact am-table-striped tpl-table-black \"\n                                       id=\"example-r\">\n                                    <thead>\n                                    <tr>\n                                        <th style=\"text-align: left\">标题</th>\n                                        <th style=\"text-align: left\">发送者</th>\n                                        <th style=\"text-align: left\">时间</th>\n                                        <th style=\"text-align: left\">操作</th>\n                                    </tr>\n                                    </thead>\n                                    <tbody v-if=\"notices.length == 0\">\n                                    <tr>\n                                        <td colspan=\"6\" align=\"center\">暂无数据</td>\n                                    </tr>\n                                    </tbody>\n                                    <tbody v-else>\n                                    <tbody v-for=\"notice in notices\">\n                                    <tr class=\"gradeX\">\n                                    <td>{{notice.title}}</td>\n                                    <td>{{notice.realname}}</td>\n                                    <td>{{notice.create_time}}</td>\n                                        <td>\n                                            <div class=\"tpl-table-black-operation\">\n                                                <a :href=\"'/projectoa/notice/notice_dtl/'+notice.id\">\n                                                    <i class=\"am-icon-search\"></i> 查看\n                                                </a>\n                                            </div>\n                                        </td>\n                                    </tr>\n                                    <!-- more data -->\n                                    </tbody>\n                                </table>\n                            </div>\n                            <div class=\"am-u-lg-12 am-cf\" v-if=\"pageInfo.pages != 1\">\n\n                                <div class=\"am-fr\">\n                                    <ul class=\"am-pagination tpl-pagination\">\n\n                                        <li><a v-on:click=\"getNotices(1)\" >首页</a></li>\n\n                                        <li >\n                                            <a v-on:click=\"getNotices(pageInfo.prePage)\" v-if=\"!pageInfo.isFirstPage\">«</a>\n                                            <a v-else>«</a>\n                                        </li>\n\n                                        <!--<li class=\"am-active\"><a href=\"#\">1</a></li>-->\n                                        <li v-for=\"n in pageInfo.pages\" v-if=\"pageNum != n\"><a v-on:click=\"getNotices(n)\">{{n}}</a></li>\n                                        <li class=\"am-active\" v-else><a v-on:click=\"getNotices(n)\">{{n}}</a></li>\n\n                                        <li >\n                                            <a v-on:click=\"getNotices(pageInfo.nextPage)\" v-if=\"!pageInfo.isLastPage\">»</a>\n                                            <a v-else>»</a>\n                                        </li>\n\n                                        <li><a v-on:click=\"getNotices(pageInfo.pages)\" >尾页</a></li>\n                                    </ul>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n    <script th:src=\"@{/js/notice.js}\"></script>\n    <script>\n        $(document).ready(function () {\n            $('#noticeA').attr('class', 'active');\n        });\n    </script>\n</div>\n</html>"
  },
  {
    "path": "src/main/resources/templates/view/notice_create.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"\n      xmlns=\"http://www.w3.org/1999/xhtml\"\n      xmlns:th=\"http://www.thymeleaf.org\"\n      xmlns:layout=\"http://www.ultraq.net.nz/thymeleaf/layout\"\n      layout:decorator=\"common/common\">\n\n<div class=\"centerView\" data-type=\"widgets\" th:fragment=\"content\">\n    <!-- 内容区域 -->\n    <div class=\"tpl-content-wrapper\">\n        <div class=\"row-content am-cf\">\n            <div class=\"row\">\n                <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-12\">\n                    <div class=\"widget am-cf\">\n                        <div class=\"row\">\n                            <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-12\">\n                                <div class=\"widget am-cf\">\n                                    <div class=\"widget-head am-cf\">\n                                        <div class=\"widget-title am-fl\">发送公告</div>\n                                    </div>\n                                    <div class=\"widget-body am-fr\">\n                                        <form class=\"am-form tpl-form-border-form tpl-form-border-br\">\n                                            <div class=\"am-form-group\">\n                                                <label for=\"noticeTile\" class=\"am-u-sm-3 am-form-label\">标题 <span\n                                                        class=\"tpl-form-line-small-title\">Title</span></label>\n                                                <div class=\"am-u-sm-9\">\n                                                    <input type=\"text\" class=\"tpl-form-input\" id=\"noticeTile\"\n                                                           placeholder=\"请输入公告标题\">\n                                                    <small>请填写公告标题 最多不要超过20字</small>\n                                                </div>\n                                            </div>\n                                            <div class=\"am-form-group\">\n                                                <label for=\"noticeMain\" class=\"am-u-sm-3 am-form-label\">公告内容</label>\n                                                <div class=\"am-u-sm-9\">\n                                                    <textarea class=\"\" rows=\"16\" id=\"noticeMain\"\n                                                              placeholder=\"请输入公告内容\"></textarea>\n                                                </div>\n                                            </div>\n                                            <div class=\"am-form-group\">\n                                                <div class=\"am-u-sm-9 am-u-sm-push-3\">\n                                                    <button  type=\"button\" class=\"am-btn am-btn-primary tpl-btn-bg-color-success \"\n                                                             onclick=\"sendNotice()\">提交\n                                                    </button>\n                                                    <a href=\"notice/notice\" type=\"button\" style=\"margin-left: 15px\"\n                                                       class=\"am-btn am-btn-primary tpl-btn-bg-color-success \">返回</a>\n                                                </div>\n                                            </div>\n                                        </form>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n    <script th:src=\"@{/js/notice_create.js}\"></script>\n    <script>\n        $(document).ready(function () {\n            $('#noticeA').attr('class', 'active');\n        });\n    </script>\n</div>\n</html>"
  },
  {
    "path": "src/main/resources/templates/view/notice_dtl.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"\n      xmlns=\"http://www.w3.org/1999/xhtml\"\n      xmlns:th=\"http://www.thymeleaf.org\"\n      xmlns:layout=\"http://www.ultraq.net.nz/thymeleaf/layout\"\n      layout:decorator=\"common/common\">\n\n<div class=\"centerView\" data-type=\"widgets\" th:fragment=\"content\">\n    <!-- 内容区域 -->\n    <div class=\"tpl-content-wrapper\" id=\"notice_dtl\">\n        <div class=\"row-content am-cf\">\n            <div class=\"row\">\n                <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-12\">\n                    <div class=\"widget am-cf\">\n                        <div class=\"row\">\n                            <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-12\">\n                                <div class=\"widget am-cf\">\n                                    <div class=\"widget-body\">\n                                        <div class=\"tpl-page-state\">\n                                            <div class=\"tpl-page-state-title am-text-center\">\n                                                <span id=\"notice_dtl_title\"></span>\n                                            </div>\n                                            <div class=\"tpl-page-state-content\">\n                                                <p id=\"notice_dtl_main\"></p>\n                                            </div>\n                                            <div class=\"tpl-page-state-content\">\n                                                <span style=\"float: right\" id=\"sendUserName\"></span>\n                                                <br/>\n                                                <span style=\"float: right\" id=\"sendTime\"></span>\n                                                <br>\n                                                <a type=\"button\" style=\"width:100px;margin: 0 auto;display:block;\"\n                                                   class=\"am-btn am-btn-primary tpl-btn-bg-color-success am-text-center\"\n                                                   href=\"notice/notice\"\n                                                >返回</a>\n                                            </div>\n                                        </div>\n\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <script th:src=\"@{/js/notice_dtl.js}\"></script>\n        <script>\n            $(document).ready(function () {\n                $('#noticeA').attr('class', 'active');\n                getNoticeDtl();\n            });\n        </script>\n    </div>\n</html>"
  },
  {
    "path": "src/main/resources/templates/view/springbootadmin.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"\n      xmlns=\"http://www.w3.org/1999/xhtml\"\n      xmlns:th=\"http://www.thymeleaf.org\"\n      xmlns:layout=\"http://www.ultraq.net.nz/thymeleaf/layout\"\n      layout:decorator=\"common/common\">\n\n<div class=\"centerView\" data-type=\"widgets\" th:fragment=\"content\">\n<!-- 内容区域 -->\n<div class=\"tpl-content-wrapper\">\n    <script>\n        // 这个页面有个古怪 在iframe后面的js不执行 所有他放在前面\n        $(document).ready(function () {\n            $('#springbootadminA').attr('class', 'active');\n             var iframeHeight = window.screen.availHeight * 0.9;\n            $('iframe').height(iframeHeight);\n        });\n    </script>\n    <div class=\"row-content am-cf\">\n        <div class=\"row\">\n            <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-12\">\n                    <div style=\"width:100%;overflow:hidden;border: 8px solid #FFFFFF;\">\n                        <iframe th:src=\"@{/monitor}\" style=\"width: 100%;margin-top: -140px\"></iframe>\n                    </div>\n            </div>\n        </div>\n    </div>\n</div>\n</div>\n</html>"
  },
  {
    "path": "src/main/resources/templates/view/table.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"\n      xmlns=\"http://www.w3.org/1999/xhtml\"\n      xmlns:th=\"http://www.thymeleaf.org\"\n      xmlns:layout=\"http://www.ultraq.net.nz/thymeleaf/layout\"\n      layout:decorator=\"common/common\">\n\n\n<div class=\"centerView\" data-type=\"widgets\" th:fragment=\"content\">\n<!-- 内容区域 -->\n<div class=\"tpl-content-wrapper\">\n    <div class=\"row-content am-cf\">\n        <div class=\"row\">\n            <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-6\">\n                <div class=\"widget am-cf\">\n                    <div class=\"widget-head am-cf\">\n                        <div class=\"widget-title am-fl\">滚动条表格</div>\n                        <div class=\"widget-function am-fr\">\n                            <a href=\"javascript:;\" class=\"am-icon-cog\"></a>\n                        </div>\n                    </div>\n                    <div class=\"widget-body  widget-body-lg am-fr\">\n                        <div class=\"am-scrollable-horizontal \">\n                            <table width=\"100%\" class=\"am-table am-table-compact am-text-nowrap tpl-table-black \"\n                                   id=\"example-r\">\n                                <thead>\n                                <tr>\n                                    <th>文章标题</th>\n                                    <th>作者</th>\n                                    <th>时间</th>\n                                    <th>操作</th>\n                                </tr>\n                                </thead>\n                                <tbody>\n                                <tr class=\"gradeX\">\n                                    <td>新加坡大数据初创公司 Latize 获 150 万美元风险融资</td>\n                                    <td>张鹏飞</td>\n                                    <td>2016-09-26</td>\n                                    <td>\n                                        <div class=\"tpl-table-black-operation\">\n                                            <a href=\"javascript:;\">\n                                                <i class=\"am-icon-pencil\"></i> 编辑\n                                            </a>\n                                            <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                                <i class=\"am-icon-trash\"></i> 删除\n                                            </a>\n                                        </div>\n                                    </td>\n                                </tr>\n                                <tr class=\"even gradeC\">\n                                    <td>自拍的“政治角色”：观众背对希拉里自拍合影表示“支持”</td>\n                                    <td>天纵之人</td>\n                                    <td>2016-09-26</td>\n                                    <td>\n                                        <div class=\"tpl-table-black-operation\">\n                                            <a href=\"javascript:;\">\n                                                <i class=\"am-icon-pencil\"></i> 编辑\n                                            </a>\n                                            <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                                <i class=\"am-icon-trash\"></i> 删除\n                                            </a>\n                                        </div>\n                                    </td>\n                                </tr>\n                                <tr class=\"gradeX\">\n                                    <td>关于创新管理，我想和你当面聊聊。</td>\n                                    <td>王宽师</td>\n                                    <td>2016-09-26</td>\n                                    <td>\n                                        <div class=\"tpl-table-black-operation\">\n                                            <a href=\"javascript:;\">\n                                                <i class=\"am-icon-pencil\"></i> 编辑\n                                            </a>\n                                            <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                                <i class=\"am-icon-trash\"></i> 删除\n                                            </a>\n                                        </div>\n                                    </td>\n                                </tr>\n                                <tr class=\"even gradeC\">\n                                    <td>究竟是趋势带动投资，还是投资引领趋势？</td>\n                                    <td>着迷</td>\n                                    <td>2016-09-26</td>\n                                    <td>\n                                        <div class=\"tpl-table-black-operation\">\n                                            <a href=\"javascript:;\">\n                                                <i class=\"am-icon-pencil\"></i> 编辑\n                                            </a>\n                                            <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                                <i class=\"am-icon-trash\"></i> 删除\n                                            </a>\n                                        </div>\n                                    </td>\n                                </tr>\n                                <tr class=\"even gradeC\">\n                                    <td>Docker领域再添一员，网易云发布“蜂巢”，加入云计算之争</td>\n                                    <td>醉里挑灯看键</td>\n                                    <td>2016-09-26</td>\n                                    <td>\n                                        <div class=\"tpl-table-black-operation\">\n                                            <a href=\"javascript:;\">\n                                                <i class=\"am-icon-pencil\"></i> 编辑\n                                            </a>\n                                            <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                                <i class=\"am-icon-trash\"></i> 删除\n                                            </a>\n                                        </div>\n                                    </td>\n                                </tr>\n\n                                <tr class=\"even gradeC\">\n                                    <td>挑战星巴克，Blue Bottle Coffee 又要开始 D 轮融资了</td>\n                                    <td>罢了</td>\n                                    <td>2016-09-26</td>\n                                    <td>\n                                        <div class=\"tpl-table-black-operation\">\n                                            <a href=\"javascript:;\">\n                                                <i class=\"am-icon-pencil\"></i> 编辑\n                                            </a>\n                                            <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                                <i class=\"am-icon-trash\"></i> 删除\n                                            </a>\n                                        </div>\n                                    </td>\n                                </tr>\n                                <!-- more data -->\n                                </tbody>\n                            </table>\n                        </div>\n\n                    </div>\n                </div>\n            </div>\n\n\n            <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-6\">\n                <div class=\"widget am-cf\">\n                    <div class=\"widget-head am-cf\">\n                        <div class=\"widget-title am-fl\">自适应表格</div>\n                        <div class=\"widget-function am-fr\">\n                            <a href=\"javascript:;\" class=\"am-icon-cog\"></a>\n                        </div>\n                    </div>\n                    <div class=\"widget-body  widget-body-lg am-fr\">\n\n                        <table width=\"100%\" class=\"am-table am-table-compact tpl-table-black \" id=\"example-r\">\n                            <thead>\n                            <tr>\n                                <th>文章标题</th>\n                                <th>作者</th>\n                                <th>时间</th>\n                                <th>操作</th>\n                            </tr>\n                            </thead>\n                            <tbody>\n                            <tr class=\"gradeX\">\n                                <td>Amaze UI 模式窗口</td>\n                                <td>张鹏飞</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n                            <tr class=\"even gradeC\">\n                                <td>有适配微信小程序的计划吗</td>\n                                <td>天纵之人</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n                            <tr class=\"gradeX\">\n                                <td>请问有没有amazeui 分享插件</td>\n                                <td>王宽师</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n                            <tr class=\"even gradeC\">\n                                <td>关于input输入框的问题</td>\n                                <td>着迷</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n                            <tr class=\"even gradeC\">\n                                <td>有没有发现官网上的下载包不好用</td>\n                                <td>醉里挑灯看键</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n\n                            <tr class=\"even gradeC\">\n                                <td>我建议WEB版本文件引入问题</td>\n                                <td>罢了</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n                            <!-- more data -->\n                            </tbody>\n                        </table>\n\n                    </div>\n                </div>\n            </div>\n        </div>\n\n        <div class=\"row\">\n\n            <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-6\">\n                <div class=\"widget am-cf\">\n                    <div class=\"widget-head am-cf\">\n                        <div class=\"widget-title am-fl\">基本边框</div>\n                        <div class=\"widget-function am-fr\">\n                            <a href=\"javascript:;\" class=\"am-icon-cog\"></a>\n                        </div>\n                    </div>\n                    <div class=\"widget-body  widget-body-lg am-fr\">\n\n                        <table width=\"100%\" class=\"am-table am-table-compact am-table-bordered tpl-table-black \"\n                               id=\"example-r\">\n                            <thead>\n                            <tr>\n                                <th>文章标题</th>\n                                <th>作者</th>\n                                <th>时间</th>\n                                <th>操作</th>\n                            </tr>\n                            </thead>\n                            <tbody>\n                            <tr class=\"gradeX\">\n                                <td>Amaze UI 模式窗口</td>\n                                <td>张鹏飞</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n                            <tr class=\"even gradeC\">\n                                <td>有适配微信小程序的计划吗</td>\n                                <td>天纵之人</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n                            <tr class=\"gradeX\">\n                                <td>请问有没有amazeui 分享插件</td>\n                                <td>王宽师</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n                            <tr class=\"even gradeC\">\n                                <td>关于input输入框的问题</td>\n                                <td>着迷</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n                            <tr class=\"even gradeC\">\n                                <td>有没有发现官网上的下载包不好用</td>\n                                <td>醉里挑灯看键</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n\n                            <tr class=\"even gradeC\">\n                                <td>我建议WEB版本文件引入问题</td>\n                                <td>罢了</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n                            <!-- more data -->\n                            </tbody>\n                        </table>\n\n                    </div>\n                </div>\n            </div>\n\n\n            <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-6\">\n                <div class=\"widget am-cf\">\n                    <div class=\"widget-head am-cf\">\n                        <div class=\"widget-title am-fl\">圆角斑马线边框</div>\n                        <div class=\"widget-function am-fr\">\n                            <a href=\"javascript:;\" class=\"am-icon-cog\"></a>\n                        </div>\n                    </div>\n                    <div class=\"widget-body  widget-body-lg am-fr\">\n\n                        <table width=\"100%\"\n                               class=\"am-table am-table-compact am-table-bordered am-table-radius am-table-striped tpl-table-black \"\n                               id=\"example-r\">\n                            <thead>\n                            <tr>\n                                <th>文章标题</th>\n                                <th>作者</th>\n                                <th>时间</th>\n                                <th>操作</th>\n                            </tr>\n                            </thead>\n                            <tbody>\n                            <tr class=\"gradeX\">\n                                <td>Amaze UI 模式窗口</td>\n                                <td>张鹏飞</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n                            <tr class=\"even gradeC\">\n                                <td>有适配微信小程序的计划吗</td>\n                                <td>天纵之人</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n                            <tr class=\"gradeX\">\n                                <td>请问有没有amazeui 分享插件</td>\n                                <td>王宽师</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n                            <tr class=\"even gradeC\">\n                                <td>关于input输入框的问题</td>\n                                <td>着迷</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n                            <tr class=\"even gradeC\">\n                                <td>有没有发现官网上的下载包不好用</td>\n                                <td>醉里挑灯看键</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n\n                            <tr class=\"even gradeC\">\n                                <td>我建议WEB版本文件引入问题</td>\n                                <td>罢了</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n                            <!-- more data -->\n                            </tbody>\n                        </table>\n\n                    </div>\n                </div>\n            </div>\n        </div>\n\n\n        <div class=\"row\">\n\n            <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-12\">\n                <div class=\"widget am-cf\">\n                    <div class=\"widget-head am-cf\">\n                        <div class=\"widget-title am-fl\">斑马线</div>\n                        <div class=\"widget-function am-fr\">\n                            <a href=\"javascript:;\" class=\"am-icon-cog\"></a>\n                        </div>\n                    </div>\n                    <div class=\"widget-body  widget-body-lg am-fr\">\n\n                        <table width=\"100%\" class=\"am-table am-table-compact am-table-striped tpl-table-black \"\n                               id=\"example-r\">\n                            <thead>\n                            <tr>\n                                <th>文章标题</th>\n                                <th>作者</th>\n                                <th>时间</th>\n                                <th>操作</th>\n                            </tr>\n                            </thead>\n                            <tbody>\n                            <tr class=\"gradeX\">\n                                <td>Amaze UI 模式窗口</td>\n                                <td>张鹏飞</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n                            <tr class=\"even gradeC\">\n                                <td>有适配微信小程序的计划吗</td>\n                                <td>天纵之人</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n                            <tr class=\"gradeX\">\n                                <td>请问有没有amazeui 分享插件</td>\n                                <td>王宽师</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n                            <tr class=\"even gradeC\">\n                                <td>关于input输入框的问题</td>\n                                <td>着迷</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n                            <tr class=\"even gradeC\">\n                                <td>有没有发现官网上的下载包不好用</td>\n                                <td>醉里挑灯看键</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n\n                            <tr class=\"even gradeC\">\n                                <td>我建议WEB版本文件引入问题</td>\n                                <td>罢了</td>\n                                <td>2016-09-26</td>\n                                <td>\n                                    <div class=\"tpl-table-black-operation\">\n                                        <a href=\"javascript:;\">\n                                            <i class=\"am-icon-pencil\"></i> 编辑\n                                        </a>\n                                        <a href=\"javascript:;\" class=\"tpl-table-black-operation-del\">\n                                            <i class=\"am-icon-trash\"></i> 删除\n                                        </a>\n                                    </div>\n                                </td>\n                            </tr>\n                            <!-- more data -->\n                            </tbody>\n                        </table>\n\n                    </div>\n                </div>\n            </div>\n\n\n        </div>\n\n    </div>\n</div>\n<script>\n    $(document).ready(function() {\n        //$('#userinfoA').attr('class','active');\n    });\n</script>\n</div>\n\n</html>"
  },
  {
    "path": "src/main/resources/templates/view/user.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"\n      xmlns=\"http://www.w3.org/1999/xhtml\"\n      xmlns:th=\"http://www.thymeleaf.org\"\n      xmlns:layout=\"http://www.ultraq.net.nz/thymeleaf/layout\"\n      layout:decorator=\"common/common\">\n\n<div class=\"centerView\" data-type=\"widgets\" th:fragment=\"content\">\n    <!-- 内容区域 -->\n    <div class=\"tpl-content-wrapper\" id=\"user\" style=\"display:none;\" v-show=\"departments.length != 0\">\n        <div class=\"row-content am-cf\">\n            <div class=\"row\">\n                <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-12\">\n                    <div class=\"widget am-cf\">\n                        <div class=\"widget-head am-cf\">\n                            <div class=\"widget-title  am-cf\">职工列表</div>\n                        </div>\n                        <div class=\"widget-body  am-fr\">\n\n                            <div class=\"am-u-sm-12 am-u-md-6 am-u-lg-2\">\n                                <div class=\"am-form-group\">\n                                    <div class=\"am-btn-toolbar\">\n                                        <div class=\"am-btn-group am-btn-group-xs\">\n                                            <a type=\"button\" class=\"am-btn am-btn-default am-btn-success\"  href='user/user_create'><span\n                                                    class=\"am-icon-plus\"></span> 新增\n                                            </a>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n\n                            <div class=\"am-u-sm-12 am-u-md-6 am-u-lg-3\">\n                                <div class=\"am-form-group tpl-table-list-select\" style=\"width: 200px\">\n                                    <select data-am-selected=\"{btnSize: 'sm'}\" id=\"department\">\n                                        <option value=\"0\">部门</option>\n                                        <option v-for=\"department in departments\" v-bind:value=\"department.id\">{{department.department}}</option>\n                                    </select>\n                                </div>\n                            </div>\n                            <div class=\"am-u-sm-12 am-u-md-6 am-u-lg-3\">\n                                <div class=\"am-form-group tpl-table-list-select\" style=\"width: 200px\">\n                                    <select data-am-selected=\"{btnSize: 'sm'}\" id=\"position\">\n                                        <option value=\"0\">职位</option>\n                                        <option v-for=\"position in positions\" v-bind:value=\"position.id\">{{position.position}}</option>\n                                    </select>\n                                </div>\n                            </div>\n                            <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-3\">\n                                <div class=\"am-input-group am-input-group-sm tpl-form-border-form cl-p\" style=\"width: 200px\">\n                                    <input type=\"text\" class=\"am-form-field \" placeholder=\"姓名\" id=\"realname\">\n                                </div>\n                            </div>\n\n                            <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-1\">\n                                <div class=\"am-input-group am-input-group-sm tpl-form-border-form cl-p\">\n                                <span class=\"am-input-group-btn\">\n                                    <button class=\"am-btn  am-btn-default am-btn-success tpl-table-list-field \" type=\"button\" v-on:click=\"getUser(1)\">\n                                        查询\n                                    </button>\n                                </span>\n                                </div>\n                            </div>\n\n                            <div class=\"am-u-sm-12\">\n                                <table width=\"100%\" class=\"am-table am-table-compact am-table-striped tpl-table-black \"\n                                       id=\"example-r\">\n                                    <thead>\n                                    <tr>\n                                        <th style=\"text-align: left\">员工姓名</th>\n                                        <th style=\"text-align: left\">部门</th>\n                                        <th style=\"text-align: left\">职位</th>\n                                        <th style=\"text-align: left\">入职时间</th>\n                                        <th style=\"text-align: left\">上次登录时间</th>\n                                        <th style=\"text-align: left\">操作</th>\n                                    </tr>\n                                    </thead>\n                                    <tbody v-if=\"userList.length == 0\" >\n                                        <tr>\n                                            <td colspan=\"6\" align=\"center\">暂无数据</td>\n                                        </tr>\n                                    </tbody>\n                                    <tbody v-else>\n                                    <tr class=\"gradeX\" v-for=\"user in userList\">\n                                        <td>{{user.realname}}</td>\n                                        <td v-for=\"department in departments\" v-if=\"department.id == user.departmentId\">\n                                            {{department.department}}\n                                        </td>\n                                        <td v-for=\"position in positions\" v-if=\"position.id == user.positionId\">\n                                            {{position.position}}\n                                        </td>\n                                        <td>{{user.createTime}}</td>\n                                        <td v-if=\"user.lastLoginTime != null\">{{user.lastLoginTime}}</td>\n                                        <td v-else>未登录</td>\n                                        <td>\n                                            <div class=\"tpl-table-black-operation\">\n                                                <a :href=\"'/projectoa/user/edit/' + user.id \">\n                                                    <i class=\"am-icon-pencil\" ></i> 编辑\n                                                </a>\n                                                <a :href=\"'/projectoa/user/userinfo/' + user.id\">\n                                                    <i class=\"am-icon-file-text\" ></i> 详情\n                                                </a>\n                                                <a class=\"tpl-table-black-operation-del\" v-on:click=\"deleteUser\" :id=\"'delete_' + user.id\">\n                                                    <i class=\"am-icon-trash\"></i> 删除\n                                                </a>\n                                                <a v-on:click=\"reverseUser\" :id=\"'reverse_' + user.id\">\n                                                    <i class=\"am-icon-refresh\"></i> 重置密码\n                                                </a>\n                                                <a v-on:click=\"setBest\" :id=\"'set' + user.id\" :id=\"'best_' + user.id\">\n                                                    <i class=\"am-icon-user\"></i> 设为最佳员工\n                                                </a>\n                                            </div>\n                                        </td>\n                                    </tr>\n\n                                    <!-- more data -->\n                                    </tbody>\n                                </table>\n                            </div>\n                            <div class=\"am-u-lg-12 am-cf\" v-if=\"pageInfo.pages != 1\">\n\n                                <div class=\"am-fr\">\n                                    <ul class=\"am-pagination tpl-pagination\">\n\n                                        <li><a v-on:click=\"getUser(1)\" >首页</a></li>\n\n                                        <li >\n                                            <a v-on:click=\"getUser(pageInfo.prePage)\" v-if=\"!pageInfo.isFirstPage\">«</a>\n                                            <a v-else>«</a>\n                                        </li>\n\n                                        <!--<li class=\"am-active\"><a href=\"#\">1</a></li>-->\n                                        <li v-for=\"n in pageInfo.pages\" v-if=\"pageNum != n\"><a v-on:click=\"getUser(n)\">{{n}}</a></li>\n                                        <li class=\"am-active\" v-else><a v-on:click=\"getUser(n)\">{{n}}</a></li>\n\n                                        <li >\n                                            <a v-on:click=\"getUser(pageInfo.nextPage)\" v-if=\"!pageInfo.isLastPage\">»</a>\n                                            <a v-else>»</a>\n                                        </li>\n\n                                        <li><a v-on:click=\"getUser(pageInfo.pages)\" >尾页</a></li>\n                                    </ul>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n    <script th:src=\"@{/js/user.js}\"></script>\n    <script>\n        $(document).ready(function() {\n            $('#userA').attr('class','active');\n        });\n    </script>\n</div>\n\n</html>"
  },
  {
    "path": "src/main/resources/templates/view/user_create.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"\n      xmlns=\"http://www.w3.org/1999/xhtml\"\n      xmlns:th=\"http://www.thymeleaf.org\"\n      xmlns:layout=\"http://www.ultraq.net.nz/thymeleaf/layout\"\n      layout:decorator=\"common/common\">\n\n<div class=\"centerView\" data-type=\"widgets\" th:fragment=\"content\">\n    <!-- 内容区域 -->\n    <div class=\"tpl-content-wrapper\" id=\"user_create\">\n        <div class=\"row-content am-cf\">\n            <div class=\"row\">\n                <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-12\">\n                    <div class=\"widget am-cf\">\n                        <div class=\"widget-head am-cf\">\n                            <div class=\"widget-title am-fl\">创建员工</div>\n                            <!--<div class=\"widget-function am-fr\">-->\n                            <!--<a href=\"javascript:;\" class=\"am-icon-cog\"></a>-->\n                            <!--</div>-->\n                        </div>\n                        <div class=\"widget-body am-fr\">\n\n                            <form class=\"am-form tpl-form-border-form tpl-form-border-br\">\n                                <div class=\"am-form-group\">\n                                    <label for=\"username\" class=\"am-u-sm-3 am-form-label\">用户名</label>\n                                    <div class=\"am-u-sm-6\">\n                                        <input type=\"text\" class=\"tpl-form-input\" id=\"username\" placeholder=\"请输入用户名\">\n                                        <small>此为登录名，请输入6-20字母或数字</small>\n                                    </div>\n                                </div>\n\n                                <div class=\"am-form-group\">\n                                    <label for=\"realname\" class=\"am-u-sm-3 am-form-label\">员工姓名 </label>\n                                    <div class=\"am-u-sm-6\">\n                                        <input type=\"text\" class=\"tpl-form-input\" id=\"realname\" placeholder=\"请输入员工姓名\">\n                                        <small>填写员工真实姓名</small>\n                                    </div>\n                                </div>\n\n\n                                <div class=\"am-form-group\">\n                                    <label for=\"department\" class=\"am-u-sm-3 am-form-label\">部门 </label>\n                                    <div class=\"am-u-sm-9\">\n                                        <select data-am-selected=\"{searchBox: 1}\" style=\"display: none;\"\n                                                id=\"department\">\n                                            <option v-for=\"department in departments\" v-bind:value=\"department.id\">\n                                                {{department.department}}\n                                            </option>\n                                        </select>\n\n                                    </div>\n                                </div>\n\n                                <div class=\"am-form-group\">\n                                    <label for=\"position\" class=\"am-u-sm-3 am-form-label\">职位 </label>\n                                    <div class=\"am-u-sm-9\">\n                                        <select data-am-selected=\"{searchBox: 1}\" style=\"display: none;\" id=\"position\">\n                                            <option v-for=\"position in positions\" v-bind:value=\"position.id\">\n                                                {{position.position}}\n                                            </option>\n                                        </select>\n\n                                    </div>\n                                </div>\n\n                                <div class=\"am-form-group\">\n                                    <div class=\"am-u-sm-9 am-u-sm-push-3\">\n                                        <button type=\"button\" class=\"am-btn am-btn-primary tpl-btn-bg-color-success \"\n                                                v-on:click=\"createUser\">提交\n                                        </button>\n                                        <a href=\"user/user\" type=\"button\"\n                                           class=\"am-btn am-btn-primary tpl-btn-bg-color-success \">返回\n                                        </a>\n                                    </div>\n\n                                </div>\n                            </form>\n                        </div>\n                    </div>\n                </div>\n            </div>\n\n\n        </div>\n    </div>\n    <script th:src=\"@{/js/user_create.js}\"></script>\n    <script>\n        $(document).ready(function () {\n            $('#userA').attr('class', 'active');\n        });\n    </script>\n</div>\n\n</html>"
  },
  {
    "path": "src/main/resources/templates/view/user_edit.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"\n      xmlns=\"http://www.w3.org/1999/xhtml\"\n      xmlns:th=\"http://www.thymeleaf.org\"\n      xmlns:layout=\"http://www.ultraq.net.nz/thymeleaf/layout\"\n      layout:decorator=\"common/common\">\n\n<div class=\"centerView\" data-type=\"widgets\" th:fragment=\"content\">\n    <!-- 内容区域 -->\n    <div class=\"tpl-content-wrapper\" id=\"user_edit\">\n        <div class=\"row-content am-cf\">\n            <div class=\"row\">\n                <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-12\">\n                    <div class=\"widget am-cf\">\n                        <div class=\"widget-head am-cf\">\n                            <div class=\"widget-title am-fl\">修改员工</div>\n                            <!--<div class=\"widget-function am-fr\">-->\n                            <!--<a href=\"javascript:;\" class=\"am-icon-cog\"></a>-->\n                            <!--</div>-->\n                        </div>\n                        <div class=\"widget-body am-fr\">\n\n                            <form class=\"am-form tpl-form-border-form tpl-form-border-br\">\n                                <div class=\"am-form-group\">\n                                    <label for=\"username\" class=\"am-u-sm-3 am-form-label\">用户名</label>\n                                    <div class=\"am-u-sm-6\">\n                                        <input type=\"text\" class=\"tpl-form-input\" id=\"username\" v-bind:value=\"user.username\" readonly=\"readonly\">\n\n                                    </div>\n                                </div>\n\n                                <div class=\"am-form-group\">\n                                    <label for=\"realname\" class=\"am-u-sm-3 am-form-label\">员工姓名 </label>\n                                    <div class=\"am-u-sm-6\">\n                                        <input type=\"text\" class=\"tpl-form-input\" id=\"realname\" v-bind:value=\"user.realname\">\n\n                                    </div>\n                                </div>\n\n\n                                <div class=\"am-form-group\">\n                                    <label for=\"department\" class=\"am-u-sm-3 am-form-label\">部门 </label>\n                                    <div class=\"am-u-sm-9\">\n                                        <select data-am-selected=\"{searchBox: 1}\" style=\"display: none;\"\n                                                id=\"department\">\n                                            <option v-for=\"department in departments\" v-bind:value=\"department.id\" v-if=\"department.id == user.departmentId\" selected=\"selected\">\n                                                {{department.department}}\n                                            </option>\n                                            <option v-else v-bind:value=\"department.id\">{{department.department}}</option>\n                                        </select>\n\n                                    </div>\n                                </div>\n\n                                <div class=\"am-form-group\">\n                                    <label for=\"position\" class=\"am-u-sm-3 am-form-label\">职位 </label>\n                                    <div class=\"am-u-sm-9\">\n                                        <select data-am-selected=\"{searchBox: 1}\" style=\"display: none;\" id=\"position\">\n                                            <option v-for=\"position in positions\" v-bind:value=\"position.id\" v-if=\"position.id == user.positionId\" selected=\"selected\">\n                                                {{position.position}}\n                                            </option>\n                                            <option v-else v-bind:value=\"position.id\">{{position.position}}</option>\n                                        </select>\n\n                                    </div>\n                                </div>\n\n                                <div class=\"am-form-group\">\n                                    <div class=\"am-u-sm-9 am-u-sm-push-3\">\n                                        <button type=\"button\" class=\"am-btn am-btn-primary tpl-btn-bg-color-success \"\n                                                v-on:click=\"editUser\">提交\n                                        </button>\n                                        <a href=\"user/user\" type=\"button\"\n                                           class=\"am-btn am-btn-primary tpl-btn-bg-color-success \">返回\n                                        </a>\n                                    </div>\n\n                                </div>\n                            </form>\n                        </div>\n                    </div>\n                </div>\n            </div>\n\n\n        </div>\n    </div>\n    <script th:src=\"@{/js/user_edit.js}\"></script>\n    <script>\n        $(document).ready(function () {\n            $('#userA').attr('class', 'active');\n        });\n    </script>\n</div>\n\n</html>"
  },
  {
    "path": "src/main/resources/templates/view/userinfo.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"\n      xmlns=\"http://www.w3.org/1999/xhtml\"\n      xmlns:th=\"http://www.thymeleaf.org\"\n      xmlns:layout=\"http://www.ultraq.net.nz/thymeleaf/layout\"\n      layout:decorator=\"common/common\">\n\n<div class=\"centerView\" data-type=\"widgets\" th:fragment=\"content\">\n<!-- 内容区域 -->\n<div class=\"tpl-content-wrapper\" id=\"userinfo\">\n    <div class=\"row-content am-cf\">\n\n        <div class=\"row\">\n\n            <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-12\">\n                <div class=\"widget am-cf\">\n                    <div class=\"widget-head am-cf\">\n                        <div class=\"widget-title am-fl\">个人信息</div>\n\n                    </div>\n                    <div class=\"widget-body am-fr\">\n\n                        <form class=\"am-form tpl-form-line-form\">\n                            <div class=\"am-form-group\">\n                                <label class=\"am-u-sm-3 am-form-label\">头像</label>\n                                <div class=\"am-u-sm-6\" style=\"cursor:pointer\"\n                                     data-am-modal=\"{target: '#changeImageModal', closeViaDimmer: 0, width: 400, height: 400}\">\n                                    <img style=\"width: 75px\" id=\"headImage\">\n                                    <small>点击此处更换</small>\n                                </div>\n\n                            </div>\n                            <div class=\"am-form-group\">\n                                <label for=\"username\" class=\"am-u-sm-3 am-form-label\">用户名</label>\n                                <div class=\"am-u-sm-6\">\n                                    <input type=\"text\" class=\"tpl-form-input\" id=\"username\" v-bind:value=\"user.username\" readonly=\"readonly\">\n\n                                </div>\n                            </div>\n\n                            <div class=\"am-form-group\">\n                                <label for=\"realname\" class=\"am-u-sm-3 am-form-label\">员工姓名 </label>\n                                <div class=\"am-u-sm-6\">\n                                    <input type=\"text\" class=\"tpl-form-input\" id=\"realname\" v-bind:value=\"user.realname\" readonly=\"readonly\">\n                                </div>\n                            </div>\n\n\n                            <div class=\"am-form-group\">\n                                <label for=\"department\" class=\"am-u-sm-3 am-form-label\">部门 </label>\n                                <div class=\"am-u-sm-6\">\n                                    <input type=\"text\" class=\"tpl-form-input\" id=\"department\"\n                                           v-for=\"department in departments\" v-if=\"department.id==user.departmentId\" v-bind:value=\"department.department\" readonly=\"readonly\">\n                                </div>\n                            </div>\n\n                            <div class=\"am-form-group\">\n                                <label for=\"position\" class=\"am-u-sm-3 am-form-label\">职位 </label>\n                                <div class=\"am-u-sm-6\">\n                                    <input type=\"text\" class=\"tpl-form-input\" id=\"position\"\n                                           v-for=\"position in positions\" v-if=\"position.id==user.positionId\" v-bind:value=\"position.position\" readonly=\"readonly\">\n                                </div>\n                            </div>\n\n                            <div class=\"am-form-group\">\n                                <label for=\"sex\" class=\"am-u-sm-3 am-form-label\">性别 </label>\n                                <div class=\"am-u-sm-6\">\n                                    <label class=\"am-radio-inline\" v-if=\"userinfo.sex==1\" name=\"sex\">\n                                        <input type=\"radio\" name=\"sex\" value=\"1\" checked=\"checked\" data-am-ucheck/>男\n                                    </label>\n                                    <label class=\"am-radio-inline\" v-else name=\"sex\">\n                                        <input type=\"radio\" name=\"sex\" value=\"1\" data-am-ucheck/>男\n                                    </label>\n                                    <label class=\"am-radio-inline\" v-if=\"userinfo.sex==2\" name=\"sex\">\n                                        <input type=\"radio\" name=\"sex\" value=\"2\" checked=\"checked\" data-am-ucheck/>女\n                                    </label>\n                                    <label class=\"am-radio-inline\" v-else name=\"sex\">\n                                        <input type=\"radio\" name=\"sex\" value=\"2\" data-am-ucheck/>女\n                                    </label>\n                                    <label class=\"am-radio-inline\" v-if=\"userinfo.sex!=1 && user.sex != 2\" name=\"sex\">\n                                        <input type=\"radio\" name=\"sex\" value=\"3\" checked=\"checked\" data-am-ucheck/>人妖\n                                    </label>\n                                    <label class=\"am-radio-inline\" v-else name=\"sex\">\n                                        <input type=\"radio\" name=\"sex\" value=\"3\" data-am-ucheck/>人妖\n                                    </label>\n                                </div>\n                            </div>\n\n                            <div class=\"am-form-group\">\n                                <label for=\"birthday\" class=\"am-u-sm-3 am-form-label\">生日</label>\n                                <div class=\"am-u-sm-6\">\n                                    <input type=\"text\" class=\"am-form-field tpl-form-no-bg\" id=\"birthday\"\n                                           data-am-datepicker=\"\" readonly=\"\">\n                                </div>\n                            </div>\n\n                            <div class=\"am-form-group\">\n                                <label for=\"age\" class=\"am-u-sm-3 am-form-label\">年龄</label>\n                                <div class=\"am-u-sm-6\">\n                                    <input type=\"text\" class=\"tpl-form-input\" id=\"age\" v-bind:value=\"userinfo.age\">\n\n                                </div>\n                            </div>\n\n                            <div class=\"am-form-group\">\n                                <label for=\"idcard\" class=\"am-u-sm-3 am-form-label\">身份证</label>\n                                <div class=\"am-u-sm-6\">\n                                    <input type=\"text\" class=\"tpl-form-input\" id=\"idcard\" v-bind:value=\"userinfo.identityCard\">\n                                </div>\n                            </div>\n\n                            <div class=\"am-form-group\">\n                                <label for=\"email\" class=\"am-u-sm-3 am-form-label\">E-mail</label>\n                                <div class=\"am-u-sm-6\">\n                                    <input type=\"text\" class=\"tpl-form-input\" id=\"email\" v-bind:value=\"userinfo.email\" >\n                                </div>\n                            </div>\n\n                            <div class=\"am-form-group\">\n                                <label for=\"qq\" class=\"am-u-sm-3 am-form-label\">QQ</label>\n                                <div class=\"am-u-sm-6\">\n                                    <input type=\"text\" class=\"tpl-form-input\" id=\"qq\" v-bind:value=\"userinfo.qq\" >\n                                </div>\n                            </div>\n\n                            <div class=\"am-form-group\">\n                                <label for=\"wechat\" class=\"am-u-sm-3 am-form-label\">微信</label>\n                                <div class=\"am-u-sm-6\">\n                                    <input type=\"text\" class=\"tpl-form-input\" id=\"wechat\" v-bind:value=\"userinfo.wechat\" >\n                                </div>\n                            </div>\n\n                            <div class=\"am-form-group\">\n                                <label for=\"weibo\" class=\"am-u-sm-3 am-form-label\">微博</label>\n                                <div class=\"am-u-sm-6\">\n                                    <input type=\"text\" class=\"tpl-form-input\" id=\"weibo\" v-bind:value=\"userinfo.weibo\" >\n                                </div>\n                            </div>\n\n                            <div class=\"am-form-group\">\n                                <label for=\"phone\" class=\"am-u-sm-3 am-form-label\">电话号码</label>\n                                <div class=\"am-u-sm-6\">\n                                    <input type=\"text\" class=\"tpl-form-input\" id=\"phone\" v-bind:value=\"userinfo.phone\">\n                                </div>\n                            </div>\n\n                            <div class=\"am-form-group\">\n                                <div class=\"am-u-sm-6 am-u-sm-push-3\">\n                                    <button type=\"button\" class=\"am-btn am-btn-primary tpl-btn-bg-color-success \" v-on:click=\"saveUserinfo\">保存\n                                    </button>\n                                </div>\n                            </div>\n                        </form>\n                    </div>\n                </div>\n            </div>\n        </div>\n\n\n    </div>\n</div>\n<script th:src=\"@{/js/userinfo.js}\"></script>\n<script>\n    $(document).ready(function () {\n        $('#userinfoA').attr('class', 'active');\n        setHeadImage('headImage');\n    });\n</script>\n</div>\n</html>"
  },
  {
    "path": "src/main/resources/templates/view/userinfo_detail.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"\n      xmlns=\"http://www.w3.org/1999/xhtml\"\n      xmlns:th=\"http://www.thymeleaf.org\"\n      xmlns:layout=\"http://www.ultraq.net.nz/thymeleaf/layout\"\n      layout:decorator=\"common/common\">\n\n<div class=\"centerView\" data-type=\"widgets\" th:fragment=\"content\">\n    <style>[class*=am-u-]+[class*=am-u-]:last-child{float:left}</style>\n    <!-- 内容区域 -->\n    <div class=\"tpl-content-wrapper\" id=\"userinfo\">\n        <div class=\"row-content am-cf\">\n\n            <div class=\"row\">\n\n                <div class=\"am-u-sm-12 am-u-md-12 am-u-lg-12\">\n                    <div class=\"widget am-cf\">\n                        <div class=\"widget-head am-cf\">\n                            <div class=\"widget-title am-fl\">个人信息</div>\n\n                        </div>\n                        <div class=\"widget-body am-fr\">\n\n                            <form class=\"am-form tpl-form-line-form\">\n                                <div class=\"am-form-group\">\n                                    <label for=\"username\" class=\"am-u-sm-3 am-form-label\">用户名</label>\n                                    <div class=\"am-u-sm-6\">\n                                        <input type=\"text\" class=\"tpl-form-input\" id=\"username\" v-bind:value=\"user.username\" readonly=\"readonly\">\n\n                                    </div>\n                                </div>\n\n                                <div class=\"am-form-group\">\n                                    <label for=\"realname\" class=\"am-u-sm-3 am-form-label\">员工姓名 </label>\n                                    <div class=\"am-u-sm-6\">\n                                        <input type=\"text\" class=\"tpl-form-input\" id=\"realname\" v-bind:value=\"user.realname\" readonly=\"readonly\">\n                                    </div>\n                                </div>\n\n\n                                <div class=\"am-form-group\">\n                                    <label for=\"department\" class=\"am-u-sm-3 am-form-label\">部门 </label>\n                                    <div class=\"am-u-sm-6\">\n                                        <input type=\"text\" class=\"tpl-form-input\" id=\"department\"\n                                               v-for=\"department in departments\" v-if=\"department.id==user.departmentId\" v-bind:value=\"department.department\" readonly=\"readonly\">\n                                    </div>\n                                </div>\n\n                                <div class=\"am-form-group\">\n                                    <label for=\"position\" class=\"am-u-sm-3 am-form-label\">职位 </label>\n                                    <div class=\"am-u-sm-6\">\n                                        <input type=\"text\" class=\"tpl-form-input\" id=\"position\"\n                                               v-for=\"position in positions\" v-if=\"position.id==user.positionId\" v-bind:value=\"position.position\" readonly=\"readonly\">\n                                    </div>\n                                </div>\n\n                                <div class=\"am-form-group\">\n                                    <label for=\"sex\" class=\"am-u-sm-3 am-form-label\">性别</label>\n                                    <div class=\"am-u-sm-6\">\n                                        <input type=\"text\" class=\"tpl-form-input\" id=\"sex\" v-if=\"userinfo.sex==1\" value=\"男\" readonly=\"readonly\">\n                                        <input type=\"text\" class=\"tpl-form-input\" id=\"sex\" v-else-if=\"userinfo.sex==2\" value=\"女\" readonly=\"readonly\">\n                                        <input type=\"text\" class=\"tpl-form-input\" id=\"sex\" v-else value=\"人妖\" readonly=\"readonly\">\n\n                                    </div>\n                                </div>\n\n                                <div class=\"am-form-group\">\n                                    <label for=\"bir\" class=\"am-u-sm-3 am-form-label\">生日</label>\n                                    <div class=\"am-u-sm-6\">\n                                        <input type=\"text\" class=\"tpl-form-input\" id=\"bir\" v-bind:value=\"userinfo.birthday\" readonly=\"readonly\">\n\n                                    </div>\n                                </div>\n\n                                <div class=\"am-form-group\">\n                                    <label for=\"age\" class=\"am-u-sm-3 am-form-label\">年龄</label>\n                                    <div class=\"am-u-sm-6\">\n                                        <input type=\"text\" class=\"tpl-form-input\" id=\"age\" v-bind:value=\"userinfo.age\" readonly=\"readonly\">\n\n                                    </div>\n                                </div>\n\n                                <div class=\"am-form-group\">\n                                    <label for=\"idcard\" class=\"am-u-sm-3 am-form-label\">身份证</label>\n                                    <div class=\"am-u-sm-6\">\n                                        <input type=\"text\" class=\"tpl-form-input\" id=\"idcard\" v-bind:value=\"userinfo.identityCard\" readonly=\"readonly\">\n                                    </div>\n                                </div>\n\n                                <div class=\"am-form-group\">\n                                    <label for=\"email\" class=\"am-u-sm-3 am-form-label\">E-mail</label>\n                                    <div class=\"am-u-sm-6\">\n                                        <input type=\"text\" class=\"tpl-form-input\" id=\"email\" v-bind:value=\"userinfo.email\" readonly=\"readonly\">\n                                    </div>\n                                </div>\n\n                                <div class=\"am-form-group\">\n                                    <label for=\"qq\" class=\"am-u-sm-3 am-form-label\">QQ</label>\n                                    <div class=\"am-u-sm-6\">\n                                        <input type=\"text\" class=\"tpl-form-input\" id=\"qq\" v-bind:value=\"userinfo.qq\" readonly=\"readonly\">\n                                    </div>\n                                </div>\n\n                                <div class=\"am-form-group\">\n                                    <label for=\"wechat\" class=\"am-u-sm-3 am-form-label\">微信</label>\n                                    <div class=\"am-u-sm-6\">\n                                        <input type=\"text\" class=\"tpl-form-input\" id=\"wechat\" v-bind:value=\"userinfo.wechat\" readonly=\"readonly\">\n                                    </div>\n                                </div>\n\n                                <div class=\"am-form-group\">\n                                    <label for=\"weibo\" class=\"am-u-sm-3 am-form-label\">微博</label>\n                                    <div class=\"am-u-sm-6\">\n                                        <input type=\"text\" class=\"tpl-form-input\" id=\"weibo\" v-bind:value=\"userinfo.weibo\" readonly=\"readonly\">\n                                    </div>\n                                </div>\n\n                                <div class=\"am-form-group\">\n                                    <label for=\"phone\" class=\"am-u-sm-3 am-form-label\">电话号码</label>\n                                    <div class=\"am-u-sm-6\">\n                                        <input type=\"text\" class=\"tpl-form-input\" id=\"phone\" v-bind:value=\"userinfo.phone\" readonly=\"readonly\">\n                                    </div>\n                                </div>\n\n                                <div class=\"am-form-group\">\n                                    <div class=\"am-u-sm-6 am-u-sm-push-3\">\n                                        <a type=\"button\" class=\"am-btn am-btn-primary tpl-btn-bg-color-success \" href=\"user/user\">返回\n                                        </a>\n                                    </div>\n                                </div>\n                            </form>\n                        </div>\n                    </div>\n                </div>\n            </div>\n\n\n        </div>\n    </div>\n    <script th:src=\"@{/js/userinfo_detail.js}\"></script>\n    <script>\n        $(document).ready(function () {\n            $('#userA').attr('class', 'active');\n        });\n    </script>\n</div>\n</html>"
  },
  {
    "path": "src/test/java/com/zmh/projectoa/ProjectoaApplicationTests.java",
    "content": "package com.zmh.projectoa;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ProjectoaApplicationTests {\n\n\t@Test\n\tpublic void contextLoads() {\n\t}\n\n}\n"
  }
]